首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >处理R中的数字(十进制)日期?

处理R中的数字(十进制)日期?
EN

Stack Overflow用户
提问于 2016-09-30 19:27:31
回答 4查看 2.7K关注 0票数 0

我有一些来自Excel的数字日期数据:

代码语言:javascript
运行
复制
> df <- data.frame(c(42613, 42612, 42614), c(42614.61, 42613.97, 42612.12))
> names(df) <- c("Closetime", "Opentime")

ClosetimeOpentime都是numeric。我希望保存OpenTime中的小时/分钟/秒数据,并将时间'00:00:00‘添加到Closetime中的每个日期

代码语言:javascript
运行
复制
> df$Closetime <- paste(as.Date(df$Closetime, origin = '1900-01-01'), c('00:00:00'))

Closetime很容易,但是当我尝试在Opentime上使用lubridate::date_decimal时,一切都会变糟。

代码语言:javascript
运行
复制
> df$Opentime <- date_decimal(df$Opentime)
> df
            Closetime             Opentime
1 2016-09-02 00:00:00 42614-08-11 15:36:00
2 2016-09-01 00:00:00 42613-12-21 01:12:00
3 2016-09-03 00:00:00 42612-02-13 22:04:48

如何使OpentimeClosetime都具有相同的类型/格式?我最终希望能在每一列的时间里,在几个小时内得到不同的结果,以供参考。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-09-30 19:43:31

如果您可以使用POSIXct,您可以例如

代码语言:javascript
运行
复制
df$Opentime <- as.POSIXct( df$Opentime*24*60*60, 
                origin="1900-01-01", 
                tz="UTC")

推理: POSIXct是从开始到现在的秒数。

票数 3
EN

Stack Overflow用户

发布于 2016-09-30 19:45:58

首先,我们遵循help("as.Date")中关于Excel的建议。我假设这里是Windows:

代码语言:javascript
运行
复制
df$Closetime_p <- as.Date(df$Closetime, origin = "1899-12-30")
df$Opentime_p <- as.Date(floor(df$Opentime), origin = "1899-12-30")

然后我们转换为POSIXct:

代码语言:javascript
运行
复制
df$Closetime_p <- as.POSIXct(as.POSIXlt(df$Closetime_p, tz = "GMT"), tz = "GMT")
df$Opentime_p <- as.POSIXct(as.POSIXlt(df$Opentime_p, tz = "GMT"), tz = "GMT")

现在我们再加一次时间:

代码语言:javascript
运行
复制
df$Opentime_p <- df$Opentime_p + (df$Opentime - floor(df$Opentime)) * 24 * 3600
#  Closetime Opentime Closetime_p          Opentime_p
#1     42613 42614.61  2016-08-31 2016-09-01 14:38:24
#2     42612 42613.97  2016-08-30 2016-08-31 23:16:48
#3     42614 42612.12  2016-09-01 2016-08-30 02:52:48
票数 2
EN

Stack Overflow用户

发布于 2016-09-30 19:46:21

按照您所做的转换到日期,然后转换为POSIXct

首先,创建data.frame (并注意我们如何设置列名):

代码语言:javascript
运行
复制
R> df <- data.frame(CloseT=c(42613, 42612, 42614), OpenT=c(42614.61, 42613.97, 42612.12))
R> df
  CloseT   OpenT
1  42613 42614.6
2  42612 42614.0
3  42614 42612.1
R> 

然后转换到目前为止:

代码语言:javascript
运行
复制
R> df$CloseT <- as.Date(df$CloseT, origin="1900-01-01")
R> df$OpenT <- as.Date(df$OpenT, origin="1900-01-01")
R> df
      CloseT      OpenT
1 2016-09-02 2016-09-03
2 2016-09-01 2016-09-02
3 2016-09-03 2016-09-01
R>

最后,转换为POSIXct

代码语言:javascript
运行
复制
R> df$OpenT <- as.POSIXct(df$OpenT)
R> df$CloseT <- as.POSIXct(df$CloseT)
R> df
               CloseT               OpenT
1 2016-09-01 19:00:00 2016-09-03 09:38:24
2 2016-08-31 19:00:00 2016-09-02 18:16:48
3 2016-09-02 19:00:00 2016-08-31 21:52:48
R> 

通过POSIXlt可以设置一个时区,就像罗兰展示的那样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39798770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档