【问题标题】:Exclude rows with certain time of day排除具有一天中特定时间的行
【发布时间】:2012-10-05 04:01:31
【问题描述】:

我有一个时间序列的连续数据,每隔 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 解析了 Timestamp 列。

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

【问题讨论】:

    标签: r datetime time posixct


    【解决方案1】:

    您似乎知道基本概念,但只是缺少细节。正如您所提到的,我们只是将时间戳转换为 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)
    

    【讨论】:

    • 这太棒了 - 非常感谢!如果我希望查看跨越两个不同日期之间边界的时段,例如从 23:00 到 05:00 的夜间数据,我想我可以应用相同类型的格式,但有两组上限和下限代替?
    【解决方案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"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 2015-05-09
      • 1970-01-01
      相关资源
      最近更新 更多