2017-07-29 134 views
2

我有一個定期的5分鐘日期時間數據集(約50)。 POSIXt/ lubridate函數很好地將我的日期時間轉換爲24小時格式。但我想在我的一天的定義中添加另一列,從早上6點到早上6點(現在是午夜到午夜)。我試圖在12AM活動之後捕獲,作爲當前日期的一部分,而不是下一個日期。R日期/日期操作

我目前正在嘗試每288行創建一個組(每天有288個5分鐘的時間間隔)。但是它造成了一個問題,因爲我的數據集不一定在獨特的時間開始。

我不想創建偏移量,因爲它會篡改對應於時間的值。

解決此問題的任何有效方法?謝謝。

+0

不確定你的意思是「我不想創建偏移量」。這是否適合您的需求? '庫(tidyverse); seq(as.POSIXct(Sys.time()),by =「5 min」,length.out = 50 * 288)%>%as_data_frame()%>% mutate(my_day = as.Date(value-as。 difftime(6,units =「hours」)))' – dmi3kno

回答

1

可以有效地通過首先產生一個seq uence的日期/時間,然後用cut在其中找到每個值落在垃圾桶做到這一點:

set.seed(2) 
dat <- Sys.time() + sort(runif(10, min=0, max=5*24*60*60)) 
dat 
# [1] "2017-07-29 15:43:10 PDT" "2017-07-29 20:23:12 PDT" "2017-07-29 22:24:22 PDT" "2017-07-31 08:22:57 PDT" 
# [5] "2017-07-31 18:13:06 PDT" "2017-07-31 21:01:10 PDT" "2017-08-01 12:30:19 PDT" "2017-08-02 04:14:03 PDT" 
# [9] "2017-08-02 17:26:14 PDT" "2017-08-02 17:28:52 PDT" 
sixs <- seq(as.POSIXct("2017-07-29 06:00:00", tz = "UTC"), as.POSIXct("2017-08-03 06:00:00", tz = "UTC"), by = "day") 
sixs 
# [1] "2017-07-29 06:00:00 UTC" "2017-07-30 06:00:00 UTC" "2017-07-31 06:00:00 UTC" "2017-08-01 06:00:00 UTC" 
# [5] "2017-08-02 06:00:00 UTC" "2017-08-03 06:00:00 UTC" 
cut(dat, sixs, label = FALSE) 
# [1] 1 1 1 3 3 3 4 5 5 5 

根據幫助頁面(?seq.POSIXt),你可以選擇by="DSTday"

1

由於我不能評論(聲譽問題,這裏新的joinee),我發佈這個答案。
結算這個問題和相應的答案:How to manipulate the time part of a date column?

它說明了一個更強大的解決方案,因爲它是獨立於您的數據結構(如重複)。

繼@meenaparam的解決方案:

轉換所有日期列dmy_hms格式從lubridate包。請根據您的具體需求,探索其他選項,如dmy_hmymd_hms等。

mutate(DATE = dmy_hms(DATE)) 

現在創建一個列來標識需要以不同方式修改的數據點。就像你的數據點00:00:00至05:59:59(hms)需要成爲上一個日期的一部分。

DAY_PAST = case_when(hour(DATE) < 6 ~ "yup", TRUE ~ "nope")) 

現在這些"yup"日期的day值轉換爲day(DATE)-1

NEW_DATE = case_when(DAY_PAST == "yup" 
     ~ make_datetime(year(DATE-86400), month(DATE-86400), day = day(DATE-86400), hour = hour(DATE)), 
     TRUE ~ DATE) 

希望這能解決你的問題。

+0

謝謝,令人驚歎! –

+0

它會爲月份開始輸入創建「NA」結果,我更新了代碼。如果它適合你,請接受我的答案。這將是我第一個接受的答案。 :) – Arani