【问题标题】:Make date out of year and repetitive sequence of 1827 days使日期超出年份和 1827 天的重复序列
【发布时间】:2018-02-07 20:37:54
【问题描述】:

我从一个数据框开始,该数据框包含从 1 到 1827 年(5 年)的数小时和数天序列。我知道第一天是 2004-01-01。我加了天。我不知道如何继续做这个日期(所以我可以将它与其他数据相匹配)。

目前的情况如下:

hour<-rep(0:24, 1828)
day_of_seq<-rep(0:1827, 25)

library(dplyr)
df<-data.frame(hour, day_of_seq)%>%
 mutate(year = ifelse((day_of_seq > 0 & day_of_seq <= 366), 2004,
               ifelse((day_of_seq >= 337 & day_of_seq <= 731), 2005,
               ifelse((day_of_seq >= 732 & day_of_seq <= 1096), 2006,
               ifelse((day_of_seq >= 1097 & day_of_seq <= 1461), 2007,
               ifelse((day_of_seq >= 1462 & day_of_seq <= 1827), 2008, "nope")))))) 

【问题讨论】:

  • as.Date('2004-01-01') + 0:1827 可以解决问题,因为将 1 添加到 Date 对象意味着添加 1 天。

标签: r date dplyr


【解决方案1】:

使用data.table:

data.table(hour, as.Date(day_seq, origin = "2004-01-01"))

【讨论】:

  • 这个例子效果很好。对于我的真实数据,由于某种原因无法识别列名,我不得不使用df$day_seq 而不仅仅是day_seq
【解决方案2】:

以 R 为基数:

seq(from=as.Date("2004-01-01"), length.out = 1827, by="1 days")

【讨论】:

    【解决方案3】:

    据我了解,OP 希望在 5 年内创建一系列每小时时间戳,这些时间戳应显示在两列中,分别为日期(Date 类)和一天中的小时(整数)。

    OP 的方法是创建一天中的小时数和天数的叉积。

    恕我直言,有一种更简单的方法,它使用seq() 方法来处理日期时间类:

    library(data.table)
    library(lubridate)
    DT <- data.table(time = seq(ymd_h("2004-01-01 00"), 
                                ymd_h("2008-01-01 00"), by = "1 hour"))
    DT
    
                          time
        1: 2004-01-01 00:00:00
        2: 2004-01-01 01:00:00
        3: 2004-01-01 02:00:00
        4: 2004-01-01 03:00:00
        5: 2004-01-01 04:00:00
       ---                    
    43845: 2008-12-31 20:00:00
    43846: 2008-12-31 21:00:00
    43847: 2008-12-31 22:00:00
    43848: 2008-12-31 23:00:00
    43849: 2009-01-01 00:00:00
    

    现在,我们可以创建 datehour 列:

    DT[, date := as.Date(time)][, hour := hour(time)][]
    
                          time       date hour
        1: 2004-01-01 00:00:00 2004-01-01    0
        2: 2004-01-01 01:00:00 2004-01-01    1
        3: 2004-01-01 02:00:00 2004-01-01    2
        4: 2004-01-01 03:00:00 2004-01-01    3
        5: 2004-01-01 04:00:00 2004-01-01    4
       ---                                    
    43845: 2008-12-31 20:00:00 2008-12-31   20
    43846: 2008-12-31 21:00:00 2008-12-31   21
    43847: 2008-12-31 22:00:00 2008-12-31   22
    43848: 2008-12-31 23:00:00 2008-12-31   23
    43849: 2009-01-01 00:00:00 2009-01-01    0
    

    警告

    OP 的方法再创建近 2000 行

    str(df)
    
    'data.frame': 45700 obs. of  3 variables:
     $ hour      : int  0 1 2 3 4 5 6 7 8 9 ...
     $ day_of_seq: int  0 1 2 3 4 5 6 7 8 9 ...
     $ year      : chr  "nope" "2004" "2004" "2004" ...
    

    比我的方法:

    str(DT)
    
    Classes ‘data.table’ and 'data.frame':    43849 obs. of  3 variables:
     $ time: POSIXct, format: "2004-01-01 00:00:00" "2004-01-01 01:00:00" "2004-01-01 02:00:00" ...
     $ date: Date, format: "2004-01-01" "2004-01-01" "2004-01-01" ...
     $ hour: int  0 1 2 3 4 5 6 7 8 9 ...
     - attr(*, ".internal.selfref")=<externalptr>
    

    这是由于 OP 以 0:24 对一天中的时间进行编号,这意味着每个午夜出现两次,分别是实际日期的 2400 小时和后续日期的 0000 小时。

    这可能是 OP 的意图,但通常2004-01-01 24:00:00 被认为与2004-01-02 00:00:00 表示时间相同的实例。

    【讨论】:

      猜你喜欢
      • 2017-09-04
      • 2015-06-20
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多