我有一个间隔为10分钟的时间序列,我想根据潮汐阶段(低潮,涨潮)进行分类。 理想情况下以例如:
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
使用以下方式生成时间序列:
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”,其中包含时间序列中每个日期的低水位和高水位时间:
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 :(得分: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")
在第一个数据帧df中添加tidal_stage列,并将其初始化为“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"))