6

我有一个时间序列的连续数据,每隔 10 分钟测量一次,为期五个月。为简单起见,数据分为两列,如下所示:

时间戳 Temp.Diff
2011 年 2 月 14 日 19:00 -0.385
2011 年 2 月 14 日 19:10 -0.535
2011 年 2 月 14 日 19:20 -0.484
2011 年 2 月 14 日 19:30 -0.409
2011 年 2 月 14 日 19:40 -0.385
2011 年 2 月 14 日 19:50 -0.215

......它会持续接下来的五个月。我已经使用as.POSIXct.

我想选择一天中特定时间的行(例如,从中午 12 点到下午 3 点),我想排除一天中的其他时间,或者只提取这 3 个小时但仍然有数据流顺序(即在时间序列中)。

4

2 回答 2

6

您似乎知道基本概念,但只是缺少细节。正如您所提到的,我们只是将时间戳转换为 POSIX 对象,然后是子集。

润滑液

最简单的方法可能是使用 lubridate。首先加载包:

library(lubridate)

接下来转换时间戳:

##*m*onth *d*ay *y*ear _ *h*our *m*inute
d = mdy_hm(dd$Timestamp)

然后我们选择我们想要的。在这种情况下,我想要晚上 7:30 之后的任何日期(无论是哪一天):

dd[hour(d) == 19 & minute(d) > 30 | hour(d) >= 20,]

基础 R 解决方案

首先创建一个上限:

lower = strptime("2/14/2011 19:30","%m/%d/%Y %H:%M")

接下来转换 POSIX 对象中的时间戳:

d = strptime(dd$Timestamp, "%m/%d/%Y %H:%M")

最后,一些数据帧子集:

dd[format(d,"%H:%M") > format(lower,"%H:%M"),]

感谢最后一部分的plannapus


上例的数据:

dd = read.table(textConnection('Timestamp Temp.Diff
"2/14/2011 19:00" -0.385
"2/14/2011 19:10" -0.535
"2/14/2011 19:20" -0.484
"2/14/2011 19:30" -0.409
"2/14/2011 19:40" -0.385
"2/14/2011 19:50" -0.215'), header=TRUE)
于 2012-10-15T08:31:27.763 回答
2

您可以使用 xts 包中基于时间的子集轻松完成此操作。假设您的 data.frame 被命名为Data

library(xts)
x <- xts(Data$Temp.Diff, Data$Timestamp)
y <- x["T12:00/T15:00"]
# you need the leading zero if the hour is a single digit
z <- x["T09:00/T12:00"]
于 2012-10-15T11:42:19.460 回答