首页 > 解决方案 > 为什么 dplyr 会转换 POSIXct 对象

问题描述

我有一个 POSIXct 类的日期时间对象。我需要通过增加几个小时来调整值。我知道我可以使用基本加法来做到这一点。例如,我可以向 POSIXct 对象添加 5 小时,如下所示:

x <- as.POSIXct("2009-08-02 18:00:00", format="%Y-%m-%d %H:%M:%S")
x
[1] "2009-08-02 18:00:00 PDT"
x + (5*60*60)
[1] "2009-08-02 23:00:00 PDT"

现在我有一个数据框,其中有些时候还可以,有些时候很糟糕。

> df
         set_time      duration           up_time
1 2009-05-31 14:10:00        3 2009-05-31 11:10:00
2 2009-08-02 18:00:00        4 2009-08-02 23:00:00
3 2009-08-03 01:20:00        5 2009-08-03 06:20:00
4 2009-08-03 06:30:00        2 2009-08-03 11:30:00

请注意,第一个数据帧条目的“up_time”小于“set_time”。因此,在这种情况下,“好”时间是 set_time < up_time 的时间。而“坏”时间是 set_time > up_time。我想留下好的条目并修复坏的条目。应通过创建等于“set_time”+ 持续时间的“up_time”来修复错误条目。我使用以下 dplyr 管道执行此操作:

 df1 <- tbl_df(df) %>% mutate(up_time = ifelse(set_time > up_time, set_time + 
 (duration*60*60), up_time))

df1
# A tibble: 4 x 3
set_time            duration     up_time
<dttm>                 <dbl>       <dbl>
1 2009-05-31 14:10:00       3. 1243815000.
2 2009-08-02 18:00:00       4. 1249279200.
3 2009-08-03 01:20:00       5. 1249305600.
4 2009-08-03 06:30:00       2. 1249324200.

正常运行时间已强制为数字:

> str(df1)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':       4 obs. of  3 variables:
$ set_time: POSIXct, format: "2009-05-31 14:10:00" "2009-08-02 18:00:00" 
"2009-08-03 01:20:00" "2009-08-03 06:30:00"
$ duration: num  3 4 5 2
$ up_time : num  1.24e+09 1.25e+09 1.25e+09 1.25e+09

我可以使用以下方法将其转换回所需的 POSIXct 格式:

> as.POSIXct(df1$up_time,origin="1970-01-01")
[1] "2009-05-31 17:10:00 PDT" "2009-08-02 23:00:00 PDT" "2009-08-03 06:20:00 
PDT" "2009-08-03 11:30:00 PDT"

但我觉得这最后一步不应该是必要的。我可以/如何避免让 dplyr 更改我的变量格式?

标签: rdplyrposixct

解决方案


推荐阅读