【问题标题】:How to select time range in POSIXct format when time range spans two dates?当时间范围跨越两个日期时,如何选择 POSIXct 格式的时间范围?
【发布时间】:2017-05-30 22:08:00
【问题描述】:

我正在尝试选择跨越 2 天的时间范围(例如 2011-01-01 17:00:00 到 2011-01-02 05:00:00)来计算某些变量的平均值(例如风速)在该时间间隔内。

样本数据:

## Create a record and some random data for every 15 min 
## over 10 days for windspeed.
dates <- seq(as.POSIXct("2011-01-01 00:00:00", tz = "GMT"),
         as.POSIXct("2011-01-10 23:59:00", tz = "GMT"),
         by = 900)
windspeed <- sample(0:20, length(dates), replace = TRUE)
Data  <- data.frame(dates = dates, windspeed = windspeed)

我能够使用 dplyr 包从我的数据集中过滤出我感兴趣的日期:

Data %>%
filter(dates > ymd_hms("2011-01-01 00:00:00", tz = GMT) & dates < ymd_hms("2011-01-04 00:00:00", tz = GMT) | dates > ymd_hms("2011-01-06 00:00:00", tz = GMT) & dates < ymd_hms("2011-01-010 00:00:00", tz = GMT))

是否有一个通配符可以用来代替上述代码中的 DATE 并且只指定感兴趣的时间间隔?或者其他计算某个时间间隔内平均值的方法,而不考虑日期?

【问题讨论】:

    标签: r posixct


    【解决方案1】:

    您可以使用例如cut.POSIXt()

    我们首先根据您的最小和最大 POSIXts 创建一些间隔来创建间隔:

    breaks <- seq(floor_date(min(Data$dates), unit = "days") + hms("17:00:00"), ceiling_date(max(Data$dates), unit = "days"), by = "12 hour")
    

    然后将您的日期/时间放入带有cut 的垃圾箱中:

    Data$lev <- cut.POSIXt(Data$dates, breaks = breaks, labels = 1:(length(breaks)-1))
    

    然后只需选择包含所需组的那些(奇数)箱(从 17:00:00 到 05:00:00)

    filter(Data, lev %in% seq(1 , max( as.numeric(as.character(unique(Data$lev))), na.rm = T ), by =2) )%>% 
      group_by(lev) %>% summarise(means  = mean(windspeed))
    
         lev     means
    1      1 10.416667
    2      3 10.625000
    3      5 11.000000
    4      7  9.979167
    5      9 11.104167
    6     11  9.562500
    7     13  9.895833
    8     15  9.937500
    9     17 10.625000
    

    PS,cut()默认设置right = TRUE,表示区间会向右闭合。您需要相应地进行调整。

    【讨论】:

    • 我明白你在做什么,但在你的例子中,你仍然在休息中定义 ymd。我的数据集跨越一百多天,我正在寻找一种方法来选择从第 1 天 17:00:00 到第 2 天 05:00:00、第 2 天 17:00:00 到 05:00 的时间间隔:00 在第 3 天,依此类推。因此,我正在寻找一种方法来过滤掉该时间间隔,而不管日期如何。
    • 太棒了!您对 cut() 函数的解释非常有帮助。你的答案是正确的。
    猜你喜欢
    • 2018-03-03
    • 2012-04-12
    • 1970-01-01
    • 2018-02-23
    • 2015-05-27
    • 2011-04-27
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    相关资源
    最近更新 更多