【问题标题】:Handling time data that goes over a day in R在 R 中处理超过一天的时间数据
【发布时间】:2018-11-01 07:46:23
【问题描述】:

我正在尝试分析一系列大型 csv 文件,这些文件每隔 3 秒左右使用 R 采样一次数据。其中一列是从实验记录的时间戳,文件名包含执行特定实验的日期。

我正在尝试将日期信息附加到时间戳。当然,这将只涉及将日期信息和时间信息组合起来,然后将其转换为 R 中 lubridate 库中的 ymd_hms 对象。

这里的挑战:有时,实验在午夜之后进行,并且数据文件没有被它分开。这就是我的意思:

>practice[50:55, ]
   time.sub         hms hours
50 23:59:53 23H 59M 53S    23
51 23:59:55 23H 59M 55S    23
52 23:59:57 23H 59M 57S    23
53 23:59:59 23H 59M 59S    23
54    0:0:1          1S     0
55    0:0:3          3S     0

practice$hmshms(practice$time.sub) 的结果,practice$hourshours(practice$hms) 的结果。

假设此数据是在181010 上获得的。我希望能够为超出23:59:59 的时间戳自动分配181011

我想要的输出如下:

>after_some_smart_thing()
   time.sub         hms hours   date
50 23:59:53 23H 59M 53S    23 181010
51 23:59:55 23H 59M 55S    23 181010
52 23:59:57 23H 59M 57S    23 181010
53 23:59:59 23H 59M 59S    23 181010
54    0:0:1          1S     0 181011
55    0:0:3          3S     0 181011

目前我能想到的最好办法是运行一个 for 循环,将 hours 的每个元素与其上方的元素进行比较,如果小时数减少,则在日期上加 1....

伪代码是:

addnumber <- 0

for (i in column length){
if (hours(i) > hours(i+1)){
    addnumber <- addnumber + 1
}
date <- date + addnumber

必须有更好的方法来处理这个问题,我寻求一些建议以简洁的方式对其进行编码以节省计算成本。谢谢。

【问题讨论】:

    标签: r lubridate


    【解决方案1】:

    这是一个使用dplyr::lag的捷径

    library(dplyr)
    df %>% mutate(A=hours-lag(hours), B=if_else(is.na(A) | A!=-23,0,1), date=181010+cumsum(B==1))
      #%>% select(-A,-B) #If you don't need them
    
      time.sub         hms hours   A B   date
    1 23:59:53 23H 59M 53S    23  NA 0 181010
    2 23:59:55 23H 59M 55S    23   0 0 181010
    3 23:59:57 23H 59M 57S    23   0 0 181010
    4 23:59:59 23H 59M 59S    23   0 0 181010
    5    0:0:1          1S     0 -23 1 181011
    6    0:0:3          3S     0   0 0 181011
    

    【讨论】:

    • 啊,这是更好的方法!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 2020-06-16
    • 2018-09-14
    • 2019-10-19
    • 1970-01-01
    相关资源
    最近更新 更多