簡體   English   中英

在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM