【问题标题】:Select interval of time series object by date and time按日期和时间选择时间序列对象的间隔
【发布时间】:2012-06-19 02:05:50
【问题描述】:

我的问题是关于如何管理空气质量数据库中的日期和时间,从 2002 年到 2008 年,它每天每十分钟保存一次数据。

我想生成几个分析和绘图,但仅参考从早上 6:00 到早上 8:00 的早晨高峰时间我试图在所需的时间间隔内生成图表,但 R 工具总是绘制 24因此,一天中的小时数会扭曲高峰时段的可用数据。

非常感谢您就如何仅在高峰时段选择和绘制间隔以及如何生成多个图表提供指导。

我有下一个脚本来生成日期间隔,但我想汇总小时间隔(早上 6-8 点)并仅绘制间隔数据:

# select interval
start.date = as.POSIXct("2007-03-27 05:00", tz = "GMT")
end.date = as.POSIXct("2007-05-27 05:00", tz = "GMT")
subdata = subset(mydata, date >= start.date & date <= end.date,
select = c(date, nox, co))
#
#plot the variables

【问题讨论】:

  • 考虑包含一小组数据,如果需要,可以添加假数据。此外,请考虑为该组数据包含所需的结果。
  • 您查看过包裹lubridate 吗?它可以满足您的需求,但如果没有任何可重复的数据,就很难提供示例。
  • 仅供参考,许多人更喜欢在 R 中使用“

标签: r date time-series hour


【解决方案1】:

我建议您使用时间序列类而不是 data.frame。使用 xts 每天按时间间隔进行子集很容易:

# use DWin's example data
Data <- data.frame(a=rnorm(240),
  dtm=as.POSIXct("2007-03-27 05:00", tz="GMT")+3600*(1:240))
# create xts object
library(xts)
x <- xts(Data[,"a"], Data[,"dtm"])
# subset by time of day
y <- x["T06:00/T08:00"]
# plot
plot(y)  # plots all 24 hours of each day
# use chartSeries from quantmod to avoid above behavior
library(quantmod)
chartSeries(y)

【讨论】:

    【解决方案2】:

    如果这是一个 data.frame,我会首先将每个条目的时间提取到一个新列中,然后用“峰值”标志标记每一行,然后使用它变得更加容易。一周中的一天同上。由于只有大约 350k 行,这将是相当快的,而且是一次性的,所以你可以做一些丑陋的事情,比如:

    # create some fake data
    t1 <- as.POSIXct(paste('2012-06-16 0', 1:9, ':00', sep=''), tz='GMT')
    N <- length(t1)
    mydata <- data.frame(timestamp=t1, co=runif(N, 1,30), nox=runif(N, 5,50))
    
    # extract out the hour of day
    mydata$hour <- gsub('^.* ', '', as.character(t1))
    # is this a peak time?
    mydata$peak <- regexpr('^0[678]', mydata$hour) >0
    

    现在您可以轻松地仅选择那些来自高峰时段的记录 - 这将是一个小得多的图表子集 - 少于 5 万条记录。

    mypeakdata <- subset(mydata, peak)
    

    由于我确信您将使用不同的假设进行许多此类分析,因此我建议您在 data.frame 中添加各种列,例如一天中的小时、一周中的一天等,并将它们留在那里,然后将这个大数据框保存为:

    save(mydata, 'mydata_version_2012-06-16_8h58.RData')
    

    【讨论】:

    • +1 令我惊讶的是,as.character.POSIXt 返回了一个格式化的日期时间对象,尽管查看代码就知道原因了。
    • 非常感谢您的回答,我去尝试与他们一起管理我的数据
    【解决方案3】:

    如果您的日期时间在名为“dtm”的列中,则此代码应获取 6A 到 8A 区间内的记录

    dfrm <- data.frame(a=rnorm(24),  
                       dtm =as.POSIXct("2007-03-27 05:00", tz='GMT') +3600*(1:24) )     
        sub6_8A <- subset(dfrm, strftime(dtm, "%H", tz="GMT") %in% c('06','07','08') )
    sub6_8A
               a                 dtm
    1  0.5020823 2007-03-27 06:00:00
    2 -0.7455312 2007-03-27 07:00:00
    3  1.8035086 2007-03-27 08:00:00
    

    您也可以使用带有“[[”的索引方法,但如果您有 NA,除非您明确排除它们,否则它们会被拖累。

    【讨论】:

    • 也是子集(dfrm, as.POSIXlt(Data$dtm)$hour %in% c(6,7,8))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    相关资源
    最近更新 更多