在R中,如何按日期拆分数据帧

在R中,如何按日期拆分数据帧,r,date,dataframe,subset,R,Date,Dataframe,Subset,我有一个数据框,其中一列是日期时间(chron)。我想将此数据帧拆分为仅按日期部分拆分的数据帧列表。因此,每个数据帧都将包含当天的所有数据。我研究了split函数,但不确定如何使用列值的一部分?诀窍是创建一个向量,告诉R如何分割数据。因此,在您的示例中,我们有一个数据帧: dd = data.frame(x = runif(100),data= paste0(1:4, "/05/13")) ##This step will depend on your data structure dd$dat

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

诀窍是创建一个向量,告诉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")
注意,我已经将日期列设置为class
POSIXlt
`POSIXt`。这样可以轻松地操纵日期

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

split_date = (dd$date -min(dd$date))/86400
由于这将导致分数,我将四舍五入到最近的一天:

split_date = floor(split_date)
现在我以标准方式使用
split
函数:

split_by_day = split(dd, split_date)

假设您有此
数据。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
编辑:

上述方法也与
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"
第三项是在夏季时间,
as.Date
检索实际日期,即减去一小时。为了避免这种情况:

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

谢谢你,我希望你能将一个函数传递到split中,在它被拆分时得到日期部分,但我想不会。我认为
strtime(dd$data,“%d/%m/%Y”)
应该是
strtime(dd$data,“%d/%m/%Y”)
但是我有一个日期时间,我需要保留时间信息。@标记只需使用
as.date
或者您可以发布一个示例来实际运行代码,这样您就会看到我的方法是有效的…@csgillespie当然了…我的示例中有秒。你为什么不喜欢这个答案?这是最好的做法。@Michele是的,看起来更好,在一行中,这在R中对于速度通常是一件好事。@Michele不确定我在哪里说过我不喜欢这个答案。无论如何+1
# 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(cut(x, "DSTday"))
[1] "2010-03-27" "2010-03-28" "2010-03-29"