在 R 中处理超过一天的时间数据
Handling time data that goes over a day in R
我正在尝试分析一系列大型 csv 文件,这些文件使用 R 每 3 秒左右采样一次数据。其中一列是实验记录的时间戳,文件名包含执行特定实验的日期.
我正在尝试将日期信息附加到时间戳。自然地,这将涉及仅组合日期信息和时间信息,然后将其转换为 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$hms
是 hms(practice$time.sub)
的结果,practice$hours
是 hours(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
必须有更好的方法来处理这个问题,我寻求一些建议以简洁的方式对其进行编码以节省计算成本。谢谢。
这是使用 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
我正在尝试分析一系列大型 csv 文件,这些文件使用 R 每 3 秒左右采样一次数据。其中一列是实验记录的时间戳,文件名包含执行特定实验的日期.
我正在尝试将日期信息附加到时间戳。自然地,这将涉及仅组合日期信息和时间信息,然后将其转换为 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$hms
是 hms(practice$time.sub)
的结果,practice$hours
是 hours(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
必须有更好的方法来处理这个问题,我寻求一些建议以简洁的方式对其进行编码以节省计算成本。谢谢。
这是使用 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