2013-05-31 46 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