2013-05-31 47 views
2

我有一个数据帧,其中一列是日期时间(时钟)。我想将这个数据帧分成仅由日期部分分割的数据帧列表。所以每个数据框都会包含当天的所有数据。我看了分裂函数,但不知道如何使用列值的一部分?在R我怎样才能按日期拆分数据帧

回答

6

说你有这个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" 

EDIT 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" 
+0

我有尽管日期时间,我需要保留时间信息。 – Mark

+0

@Mark只是使用'as.Date',或者你可以发布一个样本来实际运行代码,所以你会看到我的方法工作... – Michele

+0

@Mark和现在? :-) – Michele

1

诀窍是创建一个向量,告诉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) 
+0

谢谢你,希望你可以传递一个函数到split得到日期部分,因为它分裂,但我猜不是。 – Mark

+0

我认为'strptime(dd $ data,“%d /%m /%Y”)'应该是'strptime(dd $ data,“%d /%m /%y”) – Michele

+0

@Michele谢谢 – csgillespie