R 合并两个每日时间序列,在轮班时间汇总后

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(

我有一个测量值(例如太阳辐射),以每小时一次的时间戳为日期时间变量编制索引。我想做的是将一年中每一天的测量值相加,并将其与另一个数据源(也就是日尺度)进行匹配(比如平均室外温度)

尽管如此,第二个数据源已经从早上8:00到第二天早上8:00被关闭。我知道如何按标准日总结我的第一个变量,但我需要从8到8进行总结,以匹配两个测量值

我的数据示例

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