【问题标题】:Dividing time series by datetime period?按日期时间段划分时间序列?
【发布时间】:2014-12-12 18:38:59
【问题描述】:

我在将日期时间变量拆分为两个变量时遇到了一些问题。我的时间序列是一整年(大约 360 天)的 /hour/day/month 计数。

我想生成一个变量,范围从每个月的 1 日到每个月的 19 日,第二个变量捕获 20 到该月的剩余时间:

格式:

              datetime    hours        var1        var2          var3                 
             2011-01-1   00:00:00 
             2011-01-1   01:00:00  
             ...         ...
             2011-01-1   23:00:00

             2011-01-2   00:00:00 
             2011-01-2   01:00:00
                 ...        ...
             2011-01-2   23:00:00
             ...         ...
             ...         ...
             2011-01-20  01:00:00
                 ...
             2011-01-31  00:00:00
             ...         ...
             2011-12-30  00:00:00
             2011-12-30  01:00:00
             ..          ..

所需格式:

                  datetime1              datetime2              var1    var2     var2
             2011-01-1  00:00:00     2011-01-20  00:00:00 
             2011-01-1  01:00:00     2011-01-21  01:00:00 
              ..          ..          ..          ..
             2011-01-19 00:00:00     2011-01-30  00:00:00 
             2011-01-19 01:00:00     2011-01-30  01:00:00
              ..         ..                  ..        ...
              ..         ..                  ..        ...
             2011-12-19 00:00:00     2011-12-30  00:00:00
             2011-12-19 01:00:00     2011-12-30  01:00:00

最初,我能够通过以下方式生成日期时间变量:

          rbind or rbind.fill ( plyr) two data frames with datetime1 and datetime2
                      df3<-rbind(df1,df2) 

也就是说,原始版本(两个数据框)有这两个变量,但我现在无法将它们分开。

我只是无法制定代码...

【问题讨论】:

  • 您似乎希望以“所需格式”重叠日期。分组将由什么来完成?
  • 请在问题中输入()您的数据子集

标签: r


【解决方案1】:

试试这个来提取日期的日期:

xx <- as.Date("2014-12-31")
as.POSIXlt(xx)$mday

然后,您可以使用日期作为条件,将 NA 归于一列,将值归于另一列。

编辑:这是更深入的版本。

#Setting up a replicable example
mydata <- as.data.frame(matrix(rnorm(90), ncol=3))
names(mydata)[1:2] <- paste0("time",1:2)
mydata$time1 <- as.Date(NA)
mydata$time2 <- as.Date(NA)
str(mydata)

#Getting 30 consecutive days:
datestring <- rep(Sys.time(), 30)
for(i in 1:30)
 datestring[i]<- Sys.time() + 60*60*24*i
mydata <- cbind(datestring, mydata)

#Doing what I think you're trying to do:
for (i in 1:dim(mydata)[1]){
    if(as.POSIXlt(mydata$datestring[i])$mday <=19)
    {mydata$time1[i] <- mydata$datestring[i]}
    else {mydata$time2[i] <- mydata$datestring[i]}
}

【讨论】:

  • 感谢您的建议。但不是关于从日期时间中提取日期,而是将时间序列分成两个时间序列,如我的示例所示
  • @Mamba,我写了更深入的解释。
  • 再次感谢您的建议。这接近了我试图实现的目标。我该如何开始?我必须包含 as.Date(df$datetime) 吗?你如何对待工作时间?我你的例子是一个常数
猜你喜欢
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多