R 合并两个每日时间序列,在轮班时间汇总后
我有一个测量值(例如太阳辐射),以每小时一次的时间戳为日期时间变量编制索引。我想做的是将一年中每一天的测量值相加,并将其与另一个数据源(也就是日尺度)进行匹配(比如平均室外温度) 尽管如此,第二个数据源已经从早上8:00到第二天早上8:00被关闭。我知道如何按标准日总结我的第一个变量,但我需要从8到8进行总结,以匹配两个测量值 我的数据示例R 合并两个每日时间序列,在轮班时间汇总后,r,date,timestamp,time-series,aggregate,R,Date,Timestamp,Time Series,Aggregate,我有一个测量值(例如太阳辐射),以每小时一次的时间戳为日期时间变量编制索引。我想做的是将一年中每一天的测量值相加,并将其与另一个数据源(也就是日尺度)进行匹配(比如平均室外温度) 尽管如此,第二个数据源已经从早上8:00到第二天早上8:00被关闭。我知道如何按标准日总结我的第一个变量,但我需要从8到8进行总结,以匹配两个测量值 我的数据示例 set.seed(1L) # to create reproducible data hourly = data.frame(datetime = seq(
set.seed(1L) # to create reproducible data
hourly = data.frame(datetime = seq(from = lubridate::ymd_hm("2017-01-01 01:00"),
length.out = 168, by = "hour"),
value = rpois(168, 10))
daily = data.frame(datetime = seq(from=as.Date("2017-01-01"), length.out = 31, by="day"),
value=rnorm(31))
您可以使用
cut
,例如:
library(lubridate)
library(dplyr)
brk = seq(ymd_hm(paste(as.Date(min(hourly$datetime) - days(1)), "08:00"), tz= "UTC"), ymd_hm(paste(as.Date(max(hourly$datetime)+ days(1)), "08:00"), tz= "UTC"), by = "24 hours")
hourly$cut <- ymd_hms(cut.POSIXt(hourly$datetime, breaks = brk))
hourly2 <- hourly %>% group_by(cut) %>% summarize(value = sum(value))
hourly2$cut <- as.Date(hourly2$cut)
names(hourly2) <- names(daily)
comb <- rbind(hourly2, daily) %>% group_by(datetime) %>% summarize(value = sum(value))
datetime value
<date> <dbl>
1 2016-12-31 52.0000000
2 2017-01-01 241.5612137
3 2017-01-02 244.3689032
4 2017-01-03 271.3156334
5 2017-01-04 253.8221333
6 2017-01-05 238.5790170
7 2017-01-06 220.7118064
8 2017-01-07 167.5018586
9 2017-01-08 -0.2962494
10 2017-01-09 0.4126310
... with 22 more rows
库(lubridate)
图书馆(dplyr)
brk=seq(ymd_-hm(粘贴日期(最小(每小时$datetime)-days(1)),“08:00”),tz=“UTC”),ymd_-hm(粘贴日期(最大(每小时$datetime)+days(1)),“08:00”),tz=“UTC”),by=“24小时”)
每小时$cut%汇总(值=总和(值))
hourly2$cut您可以使用cut
,例如:
library(lubridate)
library(dplyr)
brk = seq(ymd_hm(paste(as.Date(min(hourly$datetime) - days(1)), "08:00"), tz= "UTC"), ymd_hm(paste(as.Date(max(hourly$datetime)+ days(1)), "08:00"), tz= "UTC"), by = "24 hours")
hourly$cut <- ymd_hms(cut.POSIXt(hourly$datetime, breaks = brk))
hourly2 <- hourly %>% group_by(cut) %>% summarize(value = sum(value))
hourly2$cut <- as.Date(hourly2$cut)
names(hourly2) <- names(daily)
comb <- rbind(hourly2, daily) %>% group_by(datetime) %>% summarize(value = sum(value))
datetime value
<date> <dbl>
1 2016-12-31 52.0000000
2 2017-01-01 241.5612137
3 2017-01-02 244.3689032
4 2017-01-03 271.3156334
5 2017-01-04 253.8221333
6 2017-01-05 238.5790170
7 2017-01-06 220.7118064
8 2017-01-07 167.5018586
9 2017-01-08 -0.2962494
10 2017-01-09 0.4126310
... with 22 more rows
库(lubridate)
图书馆(dplyr)
brk=seq(ymd_-hm(粘贴日期(最小(每小时$datetime)-days(1)),“08:00”),tz=“UTC”),ymd_-hm(粘贴日期(最大(每小时$datetime)+days(1)),“08:00”),tz=“UTC”),by=“24小时”)
每小时$cut%汇总(值=总和(值))
小时2$cut使用dplyr
并通过减去8小时来转换一天:
hourly %>% mutate(datetime = as_date(datetime - 8 * hours())) %>%
rbind(daily) %>%
group_by(datetime) %>%
summarize_all(sum) %>%
ungroup%>%
arrange(datetime)
结果
A tibble: 32 x 2
datetime value
<date> <dbl>
1 2016-12-31 70.0000000
2 2017-01-01 218.6726454
3 2017-01-02 244.3821258
4 2017-01-03 257.7136326
5 2017-01-04 220.4788443
6 2017-01-05 230.3729744
7 2017-01-06 248.5082639
8 2017-01-07 176.5511818
9 2017-01-08 -0.8307824
10 2017-01-09 -0.6343781
# ... with 22 more rows
A tibble:32 x 2
日期时间值
1 2016-12-31 70.0000000
2 2017-01-01 218.6726454
3 2017-01-02 244.3821258
4 2017-01-03 257.7136326
5 2017-01-04 220.4788443
6 2017-01-05 230.3729744
7 2017-01-06 248.5082639
8 2017-01-07 176.5511818
9 2017-01-08 -0.8307824
10 2017-01-09 -0.6343781
# ... 还有22排
使用dplyr
并通过减去8小时来转换一天:
hourly %>% mutate(datetime = as_date(datetime - 8 * hours())) %>%
rbind(daily) %>%
group_by(datetime) %>%
summarize_all(sum) %>%
ungroup%>%
arrange(datetime)
结果
A tibble: 32 x 2
datetime value
<date> <dbl>
1 2016-12-31 70.0000000
2 2017-01-01 218.6726454
3 2017-01-02 244.3821258
4 2017-01-03 257.7136326
5 2017-01-04 220.4788443
6 2017-01-05 230.3729744
7 2017-01-06 248.5082639
8 2017-01-07 176.5511818
9 2017-01-08 -0.8307824
10 2017-01-09 -0.6343781
# ... with 22 more rows
A tibble:32 x 2
日期时间值
1 2016-12-31 70.0000000
2 2017-01-01 218.6726454
3 2017-01-02 244.3821258
4 2017-01-03 257.7136326
5 2017-01-04 220.4788443
6 2017-01-05 230.3729744
7 2017-01-06 248.5082639
8 2017-01-07 176.5511818
9 2017-01-08 -0.8307824
10 2017-01-09 -0.6343781
# ... 还有22排
展开回答,值得注意的是,OP强调了从早上8:00到第二天早上8:00聚合的单词
将未对齐的24小时周期映射到日期
如果24小时周期与午夜不一致,即不从00:00延伸到24:00,而是在一天中的某个时间开始和结束,则不清楚哪个日期与该周期相关
我们两个都可以
期间开始的日期
期限结束的日期,或
包含时段中大部分小时的日期
只是为了说明区别:
# timestamps: 9 am, 10pm, 7 am next day
x <- lubridate::ymd_hm(c("2017-09-12 09:00", "2017-09-12 22:00", "2017-09-13 07:00"))
x
由于没有其他信息,我们假设每日
数据映射到时段开始的日期
聚合与合并
用于分组、聚合和合并数据。使用表:
library(data.table)
# aggregate data by shifted timestamp
setDT(hourly)[, .(sum.value = sum(value)),
by = .(date = as.Date(datetime + lubridate::hours(-8L)))]
请注意,用于分组和聚合的新date
列是在by
参数中动态创建的(我更喜欢data.table
)
现在,需要加入每日
数据。通过链接,可以将其组合到一个语句中:
setDT(hourly)[, .(sum.value = sum(value)),
by = .(date = as.Date(datetime + lubridate::hours(-8L)))][
setDT(daily), on = .(date = datetime), nomatch = 0L]
参数nomatch=0L
表示我们希望在这里进行内部联接。扩展为一个答案,值得注意的是,OP强调了从上午8:00到次日上午8:00聚合的单词
将未对齐的24小时周期映射到日期
如果24小时周期与午夜不一致,即不从00:00延伸到24:00,而是在一天中的某个时间开始和结束,则不清楚哪个日期与该周期相关
我们两个都可以
期间开始的日期
期限结束的日期,或
包含时段中大部分小时的日期
只是为了说明区别:
# timestamps: 9 am, 10pm, 7 am next day
x <- lubridate::ymd_hm(c("2017-09-12 09:00", "2017-09-12 22:00", "2017-09-13 07:00"))
x
由于没有其他信息,我们假设每日
数据映射到时段开始的日期
聚合与合并
用于分组、聚合和合并数据。使用表:
library(data.table)
# aggregate data by shifted timestamp
setDT(hourly)[, .(sum.value = sum(value)),
by = .(date = as.Date(datetime + lubridate::hours(-8L)))]
请注意,用于分组和聚合的新date
列是在by
参数中动态创建的(我更喜欢data.table
)
现在,需要加入每日
数据。通过链接,可以将其组合到一个语句中:
setDT(hourly)[, .(sum.value = sum(value)),
by = .(date = as.Date(datetime + lubridate::hours(-8L)))][
setDT(daily), on = .(date = datetime), nomatch = 0L]
参数nomatch=0L
表示我们希望在此处进行内部联接。您可以将时间戳移动8小时,然后转换为日期,即hourry$date使用减法小时的想法,我不知道这一点。然后你在新的日期进行分组?是的,你在新的日期进行分组。你可以将时间戳移动8小时并转换为日期,即,hourry$date interesting idea减去小时,我不知道这一点。然后你在新的日期进行分组?是的,你在新的日期进行分组。谢谢,我不知道cut.posix函数,酷!你能解释一下你的第三行是怎么工作的吗(brk@agenis,非常欢迎。它创建了一个序列,从最短日期08:00的前一天到最长日期08:00的后一天24小时。这与您在其他数据集中的数据相匹配。谢谢,我不知道cut.posix函数,酷!您能解释一下第三行是如何工作的吗(brk@agenis,非常欢迎。它创建了一个序列,从最短日期08:00的前一天到最长日期08:00的后一天,按24小时排列。这与您在其他数据集中的数据相匹配。您完全正确,我应该
date sum.value value
1: 2017-01-01 232 -0.5080862
2: 2017-01-02 222 0.5236206
3: 2017-01-03 227 1.0177542
4: 2017-01-04 228 -0.2511646
5: 2017-01-05 231 -1.4299934
6: 2017-01-06 260 1.7091210
7: 2017-01-07 144 1.4350696