2013-11-20 37 views
1

我有這個df,其中有日期&時間,日期和時間的列。當然還有CH4的觀測值和計算出的比率(我有更多的,但這與這個問題無關)。如何在R中指定觀察時間塊的開始時間

'data.frame': 1420847 obs. of 17 variables 
$ Start  : Factor w/ 1469 levels "2013-08-31 23:56:09.000",..: 2 2 2 2 2 2 2 2 2 2 ... 
$ CO2  : int 1510 1950 1190 1170 780 870 730 740 680 700 ... 
$ CH4  : int 66 77 62 58 34 51 36 43 32 40 ... 
$ Ratio  : num 0.0437 0.0395 0.0521 0.0496 0.0436 ... 
$ Start_time: POSIXlt, format: "2013-11-20 00:10:05" "2013-11-20 00:10:05" "2013-11-20 00:10:05" "2013-11-20 00:10:05" ... 
$ Start_date: Date, format: "2013-09-01" "2013-09-01" "2013-09-01" "2013-09-01" ... 

現在我希望每天分成六塊4小時,併爲每個塊分配數字1-6。但是,問題是我只有開始測量的日期和時間(Start_dateStart_time或合計Start),所以我認爲有必要將每個新的Start_time分配到block。觀察的長度變化很大,因此沒有選擇給它分配一個數字的選項。這是我想要完成的:

    Start Start_time Start_date CO2 CH4  Ratio block 
2013-09-01 00:10:05.000 00:10:05 2013-09-01 1510 66 0.04370861  1 
2013-09-01 00:10:05.000 00:10:05 2013-09-01 1950 77 0.03948718  1 
2013-09-01 05:16:55.000 05:16:55 2013-09-01 1190 62 0.05210084  2 
2013-09-01 05:16:55.000 05:16:55 2013-09-01 1170 58 0.04957265  2 
2013-09-01 05:16:55.000 05:16:55 2013-09-01 780 34 0.04358974  2 
2013-09-01 12:44:33.000 12:44:33 2013-09-01 870 51 0.05862069  4 
2013-09-01 12:44:33.000 12:44:33 2013-09-01 730 36 0.04931507  4 
2013-09-01 22:14:23.000 22:14:23 2013-09-01 740 43 0.05810811  6 
2013-09-01 22:14:23.000 22:14:23 2013-09-01 680 32 0.04705882  6 
2013-09-02 08:37:05.000 08:37:05 2013-09-02 700 40 0.05714286  3 
2013-09-02 08:37:05.000 08:37:05 2013-09-02 610 35 0.05737705  3 
2013-09-02 17:22:33.000 17:22:33 2013-09-02 630 25 0.03968254  5 
2013-09-02 17:22:33.000 17:22:33 2013-09-02 670 40 0.05970149  5 
2013-09-02 23:59:44.000 23:59:44 2013-09-02 640 37 0.05781250  6 
2013-09-02 23:59:44.000 23:59:44 2013-09-02 730 35 0.04794521  6 

我已經搜索了這個網站,也嘗試過Google,但到目前爲止,我沒有找到答案。我已經嘗試了下面的代碼,我在這個網站上找到了答案,但沒有運氣。

qaa <- split(df, cut(strptime(paste(df$Start_date, df$Start_time), format = "%Y-%m-%d %H:%M"),"4 hours")) 

此前,我試圖在幾分鐘內拆分觀察次數,所以我試圖調整該代碼。說實話,我不知道我在做什麼(正如你可以說的那樣)。

lst<- split(df, df$Start_date) 
nobs <- "4 hours" 
List <- unlist(lapply(lst, function(x) { 
    x$grp <- rep(1:(nrow(x)/nobs+1), each = nobs)[1:nrow(x)] 
    split(x, x$grp)}), recursive = FALSE) 
b <- as.matrix(do.call("rbind", List)) 

只是爲了讓你知道,再次,我就 - [R所以我花很多時間來把事情了NOOB。我對語言知之甚少,但我正在盡我所能使之發揮作用。我非常喜歡與它合作!如果在這個網站上已經有另一個類似的問題,請告訴我,這樣我就可以刪除這個..但是我還沒有找到它。

感謝您花時間閱讀我的問題並考慮回答!

回答

1

如果你可以提取從開始時間開始時間(試一下:Dealing with timestamps in R),然後你可以使用以下方法來分配正確的塊號:

df$block[df$start_hour>=0 & df$start_hour<4]<-1 
df$block[df$start_hour>=4 & df$start_hour<8]<-2 
df$block[df$start_hour>=8 & df$start_hour<12]<-3 
df$block[df$start_hour>=12 & df$start_hour<16]<-4 
df$block[df$start_hour>=16 & df$start_hour<20]<-5 
df$block[df$start_hour>=20 & df$start_hour<24]<-6 
+0

YESSS!那樣做了!我很抱歉我遲到的迴應。起初,我看不到你給我的頁面如何適用於我的DF。但是我明白了。非常感謝你! – Jalalala

0

如果您安裝lubridate特別是您會得到幫助,因爲它具有小時等有用的功能。來自Hmisc的cut2可以讓你指定一些簡單的括號,以便將你的小時分割。

library("lubridate") 
library("Hmisc") 
example<-as.factor('2013-09-01 00:10:05.000') 
example<-data.frame(example,timeslot=cut2(hour(as.POSIXct(example,"%Y-%m-%d %H:%M")),cuts=seq(0,24,4))) 
相關問題