簡體   English   中英

在R中生成統一采樣的時間序列對象

[英]Generate a uniformly sampled time series object in R

嗨,我正在尋找一個從特定開始日期到某個結束日期的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'之間的時間。 任何幫助將不勝感激。 謝謝!

使用您創建的示例系列:

  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]

這是我使用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)刪除時區並擁有正確的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM