将数据框汇总到典型的年/周

时间:2018-12-16 08:01:55

标签: r aggregate posixct

所以我有一个大数据框,其中日期时间列为POSIXct类,另一列中的价格数据为数值类。 date time列的值形式为“ 1998-12-07 02:00:00 AEST”,即20年来的半小时观测值。可以使用以下代码生成样本数据集(将100改为需要的任意数量的观察值):

data.frame(date.time = seq.POSIXt(as.POSIXct("1998-12-07 02:00:00 AEST"), as.POSIXct(Sys.Date()+1), by = "30 min")[1:100], price = rnorm(100))
我想看看典型的年份和典型的一周。因此对于典型的年份,我有以下代码:

mean.year <- aggregate(df$price, by = list(format(df$date.time, "%m-%d %H:%M")), mean)

似乎给了我我想要的东西:

      Group.1        x
1 01-01 00:00 31.86200
2 01-01 00:30 34.20526
3 01-01 01:00 28.40105
4 01-01 01:30 26.01684
5 01-01 02:00 23.68895
6 01-01 02:30 23.70632

但是“ Group.1”列属于类字符,我希望它属于POSIXct类。我该怎么办?

在典型的一周里,我有以下代码

mean.week <- aggregate(df$price, by = list(format(df$date.time, "%wday %H:%M")), mean)

输出如下

     Group.1        x
1 0day 00:00 33.05613
2 0day 00:30 30.92815
3 0day 01:00 29.26245
4 0day 01:30 29.47959
5 0day 02:00 29.18380
6 0day 02:30 25.99400

再次,列“ Group.1”具有类字符,我想使用POSIXct。另外,我希望将星期几设置为“星期一”,“星期二”等,而不是0day。我该怎么办?

1 个答案:

答案 0 :(得分:1)

将日期时间转换为可以有效转换回POSIXct的字符串,然后执行以下操作:

mean.year <- aggregate(df["price"], 
  by = list(time = as.POSIXct(format(df$date.time, "2000-%m-%d %H:%M"))), mean)
head(mean.year)
##                  time       price
## 1 2000-12-07 02:00:00 -0.56047565
## 2 2000-12-07 02:30:00 -0.23017749
## 3 2000-12-07 03:00:00  1.55870831
## 4 2000-12-07 03:30:00  0.07050839
## 5 2000-12-07 04:00:00  0.12928774
## 6 2000-12-07 04:30:00  1.71506499

要获取星期几,请使用%a%A-有关百分比代码的列表,请参见?strptime

mean.week <- aggregate(df["price"], 
  by = list(time = format(df$date.time, "%a %H:%M")), mean)
head(mean.week)
##        time       price
## 1 Mon 02:00 -0.56047565
## 2 Mon 02:30 -0.23017749
## 3 Mon 03:00  1.55870831
## 4 Mon 03:30  0.07050839
## 5 Mon 04:00  0.12928774
## 6 Mon 04:30  1.71506499

注意

输入df以可重复的形式出现-请注意,set.seed是可重复的:

set.seed(123)
df <- data.frame(date.time = seq.POSIXt(as.POSIXct("1998-12-07 02:00:00 AEST"),
  as.POSIXct(Sys.Date()+1), by = "30 min")[1:100], price = rnorm(100))