按日期时间划分时间序列?

时间:2014-12-12 18:38:59

标签: r

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

我想生成一个变量,范围从每个月的第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) 

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

我只能制定代码......

1 个答案:

答案 0 :(得分:0)

尝试此操作以提取日期的日期:

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]}
}