【问题标题】:Generate a uniformly sampled time series object in R在 R 中生成均匀采样的时间序列对象
【发布时间】:2016-09-11 21:03:50
【问题描述】:

您好,我希望从特定开始日期到某个结束日期以 30 分钟的间隔生成一个均匀采样的时间序列。然而,限制是每天 30 分钟的间隔从 7:00 开始,到 18:30 结束,即我需要时间序列对象类似于

c('2016-08-19 07:00:00', 
  '2016-08-19 07:30:00',  
   ..., 
  '2016-08-19 18:30:00', 
  '2016-08-20 07:00:00',
   ...,
  '2016-08-20 18:30:00',
   ...
   '2016-08-31 18:30:00')

没有限制可以用类似的东西来完成

seq(as.POSIXct('2016-08-19 07:00:00'), as.POSIXct('2016-08-21 18:30:00'), by="30 min")

但在这种情况下,我不想要 '2016-08-20 18:30:00' 和 '2016-08-21 07:30:00' 之间的时间。任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 我不清楚您为什么粘贴了不会生成任何内容的随机代码...请展示您想要的输出示例。

标签: r datetime time-series


【解决方案1】:

使用您创建的示例系列:

  ts <- seq(as.POSIXct('2016-08-19 07:00:00'), 
              as.POSIXct('2016-08-21 18:30:00'), by="30 min")

使用strftime 从您的系列中提取小时数:

hours <- strftime(ts, format="%H:%M:%S")

> head(hours)
[1] "07:00:00" "07:30:00"
[3] "08:00:00" "08:30:00"
[5] "09:00:00" "09:30:00"

然后您可以将其转换回POSIXct

hours <- as.POSIXct(hours, format="%H:%M:%S")

这将保留一天中的时间,但它会将日期变为今天的日期:

> head(hours)
[1] "2016-09-11 07:00:00 EDT"
[2] "2016-09-11 07:30:00 EDT"
[3] "2016-09-11 08:00:00 EDT"
[4] "2016-09-11 08:30:00 EDT"
[5] "2016-09-11 09:00:00 EDT"
[6] "2016-09-11 09:30:00 EDT"
> tail(hours)
[1] "2016-09-11 16:00:00 EDT"
[2] "2016-09-11 16:30:00 EDT"
[3] "2016-09-11 17:00:00 EDT"
[4] "2016-09-11 17:30:00 EDT"
[5] "2016-09-11 18:00:00 EDT"
[6] "2016-09-11 18:30:00 EDT"

然后您可以根据您想要的条件创建一个 TRUE/FALSE 向量:

condition <- hours > "2016-09-11 07:30:00 EDT" & 
             hours < "2016-09-11 18:30:00 EDT"

然后根据此条件过滤您的原始系列:

ts[condition]

【讨论】:

    【解决方案2】:

    这是我使用 lubridate 包的简短而方便的解决方案

    library("lubridate")
    
    list <- lapply(0:2, function(x){
    
      temp <- ymd_hms('2016-08-19 07:00:00') + days(x) 
    
      result <- temp + minutes(seq(0, 690, 30))
    
      return(strftime(result))
    
    })
    
    do.call("c", list)
    

    我必须使用strftime(result) 来删除时区并设置正确的时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-21
      • 2020-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 2012-09-18
      相关资源
      最近更新 更多