【问题标题】:In R how can I split a dataframe by date在 R 中,如何按日期拆分数据框
【发布时间】:2013-05-27 00:01:17
【问题描述】:

我有一个数据框,其中一列是日期时间 (chron)。我想将此数据框拆分为仅按日期部分拆分的数据框列表。因此,每个数据框都将包含当天的所有数据。我查看了 split 函数,但不确定如何使用列值的一部分?

【问题讨论】:

    标签: r date dataframe subset


    【解决方案1】:

    说你有这个data.frame

        df <- data.frame(date=rep(seq.POSIXt(as.POSIXct("2010-01-01 15:26"), by="day", length.out=3), each=3), var=rnorm(9))
    > df
                     date         var
    1 2010-01-01 15:26:00 -0.02814237
    2 2010-01-01 15:26:00 -0.26924825
    3 2010-01-01 15:26:00 -0.57968310
    4 2010-01-02 15:26:00  0.88089757
    5 2010-01-02 15:26:00 -0.79954092
    6 2010-01-02 15:26:00  1.87145778
    7 2010-01-03 15:26:00  0.93234835
    8 2010-01-03 15:26:00  1.29130038
    9 2010-01-03 15:26:00 -1.09841234
    

    您只需要按天拆分:

     > split(df, as.Date(df$date))
    $`2010-01-01`
                     date         var
    1 2010-01-01 15:26:00 -0.02814237
    2 2010-01-01 15:26:00 -0.26924825
    3 2010-01-01 15:26:00 -0.57968310
    
    $`2010-01-02`
                     date        var
    4 2010-01-02 15:26:00  0.8808976
    5 2010-01-02 15:26:00 -0.7995409
    6 2010-01-02 15:26:00  1.8714578
    
    $`2010-01-03`
                     date        var
    7 2010-01-03 15:26:00  0.9323484
    8 2010-01-03 15:26:00  1.2913004
    9 2010-01-03 15:26:00 -1.0984123
    

    编辑:

    上述方法也与chron datetime 对象一致:

    x <- chron(dates = "02/27/92", times = "22:29:56")
    > x
    [1] (02/27/92 22:29:56)
    > as.Date(x)
    [1] "1992-02-27"
    

    编辑 2

    确保as.Date 不会更改您的数据至关重要,请参阅此处:

    # I'm using "DSTday" to make a sequece of one entire _apparent_ day
    x <- rep(seq.POSIXt(as.POSIXct("2010-03-27 00:31"), by="DSTday", length.out=3))
    > x
    [1] "2010-03-27 00:31:00 GMT" "2010-03-28 00:31:00 GMT" "2010-03-29 00:31:00 BST"
    > as.Date(x)
    [1] "2010-03-27" "2010-03-28" "2010-03-28"
    

    第三项是夏令时,as.Date 检索实际天,即减去一小时。为避免这种情况:

    > as.Date(cut(x, "DSTday"))
    [1] "2010-03-27" "2010-03-28" "2010-03-29"
    

    【讨论】:

    • 我有一个日期时间,我需要保留时间信息。
    • @Mark 只需使用as.Date 或者您可以发布一个示例来实际运行代码,这样您就会看到我的方法有效...
    • @csgillespie 当然......在我的例子中有几秒钟。为什么你不喜欢这个答案?这是最佳做法。
    • @Michele 是的,这看起来更好,而且都在一条线上,这通常在 R 中对于速度来说是一件好事。
    • @Michele 不确定我在哪里说我不喜欢这个答案。无论如何+1
    【解决方案2】:

    诀窍是创建一个向量来告诉 R 如何拆分数据。因此,在您的示例中,我们有一个数据框:

    dd = data.frame(x = runif(100),data= paste0(1:4, "/05/13"))
    ##This step will depend on your data structure
    dd$date = strptime(dd$data, "%d/%m/%y")
    

    请注意,我已将日期列设置为 POSIXlt`POSIXt` 类。这允许轻松操作日期。

    接下来,我将创建要拆分的变量 - split_date。基本上,我从所有其他日期中减去最短日期,然后除以一天中的秒数:

    split_date = (dd$date -min(dd$date))/86400
    

    由于这会产生分数,我将向下舍入到最近的一天:

    split_date = floor(split_date)
    

    现在我以标准方式使用split 函数:

    split_by_day = split(dd, split_date)
    

    【讨论】:

    • 谢谢您,希望您可以将一个函数传递给 split ,以便在拆分时获取日期部分,但我猜不是。
    • 我认为strptime(dd$data, "%d/%m/%Y") 应该是strptime(dd$data, "%d/%m/%y")
    猜你喜欢
    • 2021-10-04
    • 2021-09-16
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 2014-12-28
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多