根据R

时间:2017-05-04 16:36:49

标签: r datetime time-series subset posixct

我有一个间隔为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小时)

任何帮助非常感谢!谢谢。

1 个答案:

答案 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"))