2017-05-04 64 views
0

我有一個10分鐘的時間序列,我想根據潮汐階段(低潮,高潮)進行分類。 理想地結束於例如:根據時間點在不同數據框中的時間點分類R

start_time <- as.POSIXct("2016-05-30 10:50:00", tz="CET") 
end_time <- as.POSIXct("2016-07-20 08:50:00", tz="CET") 
time_seq <- seq(from=start_time, to=end_time, by="10 min") 

我有一個單獨的數據幀「hw_lw」含有低水和高水的時間中的時間序列中的每個日期:

 date_time tidal_stage 
30/05/2016 10:50 low 
30/05/2016 11:00 low 
30/05/2016 11:10 mid 
30/05/2016 11:20 mid 
30/05/2016 11:30 mid 
30/05/2016 11:40 mid 
30/05/2016 11:50 high 
30/05/2016 12:00 high 

時間序列使用已經生成的

 high_water   low_water  date 
1 2016-05-30 07:39:00 2016-05-30 04:14:00 2016-05-30 
2 2016-05-30 20:01:00 2016-05-30 16:35:00 2016-05-30 
3 2016-05-31 08:49:00 2016-05-31 05:17:00 2016-05-31 
4 2016-05-31 21:14:00 2016-05-31 17:48:00 2016-05-31 
5 2016-06-01 10:04:00 2016-06-01 06:30:00 2016-06-01 
6 2016-06-01 23:36:00 2016-06-01 19:09:00 2016-06-01 

如何將「tidal_stage」列添加到時間序列中,將每次分類爲「低」,「高」或「中」潮,其中「低潮」= 1.5小時前後低水; 「高潮」=高潮前後1.5小時,「中潮」=所有其他點?

我曾考慮過使用子集,但我只發現如何在特定時間間隔(例如,下午1點至下午2點之間)內執行此操作,而不是在特定時間點添加或減少時間時(例如,下午2點後1.5小時)。

任何幫助非常感謝!謝謝。

回答

0

所有你需要改變你的hw_dw數據幀的格式,你有兩個低水和每天兩個高水首先:

hw_lw2=data.frame(hw_lw[seq(1,nrow(hw_lw),by=2)],hw_lw[seq(2,nrow(hw_lw),by=2),1:2]) 
names(hw_lw2)=c("high_water1","low_water1","date","high_water2","low_water2") 

添加tidal_stage列到你的第一個數據幀DF和initalize它到「mid」,並在每個數據幀中都有一個日期列。

df$tidal_stage=rep("mid",nrow(df)) 
df$date=as.Date(df$time_date) 
hw_lw2$date=as.Date(hw_lw2$date) 

然後你就可以執行左連接上使用的日期作爲關鍵兩個data.frames,並找出潮汐階段:

df2=merge(df,hw_lw2,by="date") 
dt=as.difftime(1.5,units="hours") 
df2$tidal_stage[(df2$date_time>(df2$low_water1-dt) & df2$date_time<(df2$low_water1+dt)) | (df2$date_time>(df2$low_water2-dt) & df2$date_time<(df2$low_water2+dt))]="low" 
df2$tidal_stage[(df2$date_time>(df2$high_water1-dt) & df2$date_time<(df2$high_water1+dt)) | (df2$date_time>(df2$high_water2-dt) & df2$date_time<(df2$high_water2+dt))]="high" 

最後,你可以刪除不需要的列:

df2=subset(df2,select=c("date_time","tidal_stage"))