以 10 分钟为周期获取时间序列的每小时均值
Obtaining hourly means of time series with 10 minutes period
我有一个包含 10 列的数据框。第一列属于 POSIXIt 格式的日期,它还有日期和时间。最后九列属于变量。数据见下
str(combined)
'data.frame': 60118 obs. of 10 variables:
$ date: POSIXlt, format: "2014-02-19 23:50:00" "2014-02-20 00:00:00" "2014-02-20 00:10:00" "2014-02-20 00:20:00" ...
$ t1 : num 3895 3742 3900 3893 3900 ...
$ t2 : num 3900 3829 3900 3900 3900 ...
$ t3 : num 3900 3823 3900 3900 3900 ...
$ t4 : num 3900 3838 3900 3900 3900 ...
$ t5 : num 3888 3665 3899 3875 3900 ...
$ t6 : num 3894 3732 3900 3892 3900 ...
$ t7 : num 3900 3833 3900 3900 3900 ...
$ t8 : num 3865 3600 3898 3857 3900 ...
$ t9 : num 3785 3400 3876 3769 3888 ...
head(dput(combined))
date t1 t2 t3 t4 t5 t6 t7 t8 t9
1 2014-02-19 23:50:00 3895.3 3900.0 3900.0 3900.0 3887.7 3893.7 3900.0 3864.9 3785.4
2 2014-02-20 00:00:00 3742.4 3829.3 3823.0 3838.5 3664.6 3731.7 3833.4 3600.5 3400.1
3 2014-02-20 00:10:00 3900.0 3900.0 3900.0 3900.0 3899.4 3900.0 3900.0 3897.6 3876.3
4 2014-02-20 00:20:00 3892.7 3900.0 3899.6 3900.0 3875.0 3892.5 3900.0 3857.3 3769.3
5 2014-02-20 00:30:00 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3899.8 3887.7
6 2014-02-20 00:40:00 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0
如上所示,时间为 10 分钟。我只想取平均 10 分钟的数据来获得每小时的平均值,我已经使用了下面的命令。
hourly = aggregate(cbind(t1,t2,t3,t4,t5,t6,t7,t8,t9)~hour(date)+day(date), FUN=mean, na.rm=TRUE, data=combined)
但奇怪的是,得出的平均值并不正确。您可以在下面看到每小时的数据框。
hour(date) day(date) t1 t2 t3 t4 t5 t6 t7 t8 t9
1 0 1 1268.661 1366.227 1332.414 1430.629 1312.232 1321.931 1365.395 1310.339 1268.267
2 1 1 1362.630 1477.823 1425.480 1540.456 1411.321 1434.990 1491.545 1447.811 1391.001
3 2 1 1267.275 1383.586 1349.843 1440.108 1321.554 1353.461 1416.698 1351.580 1294.068
4 3 1 1107.732 1231.535 1226.436 1294.794 1172.119 1253.421 1349.420 1245.668 1191.140
5 4 1 1069.490 1207.657 1206.873 1271.574 1163.368 1248.183 1330.854 1231.273 1182.910
6 5 1 1229.902 1340.989 1345.615 1400.487 1300.392 1382.335 1497.015 1324.315 1347.073
此外,这些数据属于哪个日期也无法确定。结果,我只想将时间和日期列放在一起。
任何帮助将不胜感激!
提前致谢。
您可以试试 data.table
。
require("data.table")
r1<-read.table(text=" date time t1 t2 t3 t4 t5 t6 t7 t8 t9
1 2014-02-19 23:50:00 3895.3 3900.0 3900.0 3900.0 3887.7 3893.7 3900.0 3864.9 3785.4
2 2014-02-20 00:00:00 3742.4 3829.3 3823.0 3838.5 3664.6 3731.7 3833.4 3600.5 3400.1
3 2014-02-20 00:10:00 3900.0 3900.0 3900.0 3900.0 3899.4 3900.0 3900.0 3897.6 3876.3
4 2014-02-20 00:20:00 3892.7 3900.0 3899.6 3900.0 3875.0 3892.5 3900.0 3857.3 3769.3
5 2014-02-20 00:30:00 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3899.8 3887.7
6 2014-02-20 00:40:00 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0",header=T,row.names=1)
r1[,1]<-as.POSIXct(strptime(r1[,1], "%Y-%m-%d"))
r1[,2]<-hour(as.POSIXct(strptime(r1[,2], "%H:%M:%S")))
setDT(r1)
r1[, lapply(.SD, mean), by=.(date,time)]
date time t1 t2 t3 t4 t5 t6
1: 2014-02-19 23 3895.30 3900.00 3900.00 3900.0 3887.7 3893.70
2: 2014-02-20 0 3867.02 3885.86 3884.52 3887.7 3847.8 3864.84
t7 t8 t9
1: 3900.00 3864.90 3785.40
2: 3886.68 3831.04 3766.68
这是 dplyr
和 lubridate::floor_date()
的快速解决方案
library(dplyr)
library(lubridate)
r1 %>%
group_by(floor_date(date, "hour")) %>%
summarize_if(is.double, mean)
# A tibble: 2 x 10
`floor_date(as.POSIXct(date), "hour")` t1 t2 t3 t4 t5 t6 t7 t8 t9
<dttm> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2014-02-19 23:00:00 3895.30 3900.00 3900.00 3900.0 3887.7 3893.70 3900.00 3864.90 3785.40
2 2014-02-20 00:00:00 3867.02 3885.86 3884.52 3887.7 3847.8 3864.84 3886.68 3831.04 3766.68
我需要这个命令。
hourly= aggregate(list(turbine=combined[2:10]),by=list(date=cut(as.POSIXct(combined$date),"hour")),mean)
非常感谢。
我有一个包含 10 列的数据框。第一列属于 POSIXIt 格式的日期,它还有日期和时间。最后九列属于变量。数据见下
str(combined)
'data.frame': 60118 obs. of 10 variables:
$ date: POSIXlt, format: "2014-02-19 23:50:00" "2014-02-20 00:00:00" "2014-02-20 00:10:00" "2014-02-20 00:20:00" ...
$ t1 : num 3895 3742 3900 3893 3900 ...
$ t2 : num 3900 3829 3900 3900 3900 ...
$ t3 : num 3900 3823 3900 3900 3900 ...
$ t4 : num 3900 3838 3900 3900 3900 ...
$ t5 : num 3888 3665 3899 3875 3900 ...
$ t6 : num 3894 3732 3900 3892 3900 ...
$ t7 : num 3900 3833 3900 3900 3900 ...
$ t8 : num 3865 3600 3898 3857 3900 ...
$ t9 : num 3785 3400 3876 3769 3888 ...
head(dput(combined))
date t1 t2 t3 t4 t5 t6 t7 t8 t9
1 2014-02-19 23:50:00 3895.3 3900.0 3900.0 3900.0 3887.7 3893.7 3900.0 3864.9 3785.4
2 2014-02-20 00:00:00 3742.4 3829.3 3823.0 3838.5 3664.6 3731.7 3833.4 3600.5 3400.1
3 2014-02-20 00:10:00 3900.0 3900.0 3900.0 3900.0 3899.4 3900.0 3900.0 3897.6 3876.3
4 2014-02-20 00:20:00 3892.7 3900.0 3899.6 3900.0 3875.0 3892.5 3900.0 3857.3 3769.3
5 2014-02-20 00:30:00 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3899.8 3887.7
6 2014-02-20 00:40:00 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0
如上所示,时间为 10 分钟。我只想取平均 10 分钟的数据来获得每小时的平均值,我已经使用了下面的命令。
hourly = aggregate(cbind(t1,t2,t3,t4,t5,t6,t7,t8,t9)~hour(date)+day(date), FUN=mean, na.rm=TRUE, data=combined)
但奇怪的是,得出的平均值并不正确。您可以在下面看到每小时的数据框。
hour(date) day(date) t1 t2 t3 t4 t5 t6 t7 t8 t9
1 0 1 1268.661 1366.227 1332.414 1430.629 1312.232 1321.931 1365.395 1310.339 1268.267
2 1 1 1362.630 1477.823 1425.480 1540.456 1411.321 1434.990 1491.545 1447.811 1391.001
3 2 1 1267.275 1383.586 1349.843 1440.108 1321.554 1353.461 1416.698 1351.580 1294.068
4 3 1 1107.732 1231.535 1226.436 1294.794 1172.119 1253.421 1349.420 1245.668 1191.140
5 4 1 1069.490 1207.657 1206.873 1271.574 1163.368 1248.183 1330.854 1231.273 1182.910
6 5 1 1229.902 1340.989 1345.615 1400.487 1300.392 1382.335 1497.015 1324.315 1347.073
此外,这些数据属于哪个日期也无法确定。结果,我只想将时间和日期列放在一起。
任何帮助将不胜感激!
提前致谢。
您可以试试 data.table
。
require("data.table")
r1<-read.table(text=" date time t1 t2 t3 t4 t5 t6 t7 t8 t9
1 2014-02-19 23:50:00 3895.3 3900.0 3900.0 3900.0 3887.7 3893.7 3900.0 3864.9 3785.4
2 2014-02-20 00:00:00 3742.4 3829.3 3823.0 3838.5 3664.6 3731.7 3833.4 3600.5 3400.1
3 2014-02-20 00:10:00 3900.0 3900.0 3900.0 3900.0 3899.4 3900.0 3900.0 3897.6 3876.3
4 2014-02-20 00:20:00 3892.7 3900.0 3899.6 3900.0 3875.0 3892.5 3900.0 3857.3 3769.3
5 2014-02-20 00:30:00 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3899.8 3887.7
6 2014-02-20 00:40:00 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0 3900.0",header=T,row.names=1)
r1[,1]<-as.POSIXct(strptime(r1[,1], "%Y-%m-%d"))
r1[,2]<-hour(as.POSIXct(strptime(r1[,2], "%H:%M:%S")))
setDT(r1)
r1[, lapply(.SD, mean), by=.(date,time)]
date time t1 t2 t3 t4 t5 t6
1: 2014-02-19 23 3895.30 3900.00 3900.00 3900.0 3887.7 3893.70
2: 2014-02-20 0 3867.02 3885.86 3884.52 3887.7 3847.8 3864.84
t7 t8 t9
1: 3900.00 3864.90 3785.40
2: 3886.68 3831.04 3766.68
这是 dplyr
和 lubridate::floor_date()
library(dplyr)
library(lubridate)
r1 %>%
group_by(floor_date(date, "hour")) %>%
summarize_if(is.double, mean)
# A tibble: 2 x 10
`floor_date(as.POSIXct(date), "hour")` t1 t2 t3 t4 t5 t6 t7 t8 t9
<dttm> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2014-02-19 23:00:00 3895.30 3900.00 3900.00 3900.0 3887.7 3893.70 3900.00 3864.90 3785.40
2 2014-02-20 00:00:00 3867.02 3885.86 3884.52 3887.7 3847.8 3864.84 3886.68 3831.04 3766.68
我需要这个命令。
hourly= aggregate(list(turbine=combined[2:10]),by=list(date=cut(as.POSIXct(combined$date),"hour")),mean)
非常感谢。