我有两个每日时间序列,从2016年1月1日至2016年8月1日,但我的系列只包括工作日的数据(即周末和银行假日除外),另一个是每日数据。我的问题是,如何将这两个序列合并,以便对于两个时间序列,我只有剩余的工作日数据(从第二个时间序列中删除那些额外的天数)。
发布于 2017-03-29 07:33:02
这个问题也是用data.table标记的,所以我猜这两个时间序列被存储为data.frames或data.tables。
默认情况下,data.table中的联接是正确的联接。因此,如果您事先知道“较短”的时间序列是哪一个,您可以写:
library(data.table)
dt_long[dt_short, on = "date"]
# date weekday i.weekday
#1: 2017-03-30 4 4
#2: 2017-03-31 5 5
#3: 2017-04-03 1 1
#4: 2017-04-04 2 2
#5: 2017-04-05 3 3
#6: 2017-04-06 4 4如果您不确定哪个“较短”的时间序列是,您可以使用内部连接。
dt_short[dt_long, on = "date", nomatch = 0]nomatch = 0指定内部连接。
如果您的时间序列不是data.tables作为这里的示例数据,而是存储为data.frames,那么您需要事先通过以下方法将它们强制放到data.table类中:
setDT(dt_long)
setDT(dt_short)数据
由于OP没有提供任何可重复的数据,我们需要自己准备样本数据(类似于this answer,但作为data.table):
library(data.table)
dt_long <- data.table(date = as.Date("2017-03-30") + 0:7)
# add payload: integer weekday according ISO (week starts on Monday == 1L)
dt_long[, weekday := as.integer(format(date, "%u"))]
# remove weekends
dt_short <- dt_long[weekday < 6L]发布于 2017-03-26 02:28:44
我们有两个包含周末的data.frames df_long和不包括周末的df_short
Date <- as.Date(seq(as.Date("2003-03-03"), as.Date("2003-03-17"), by = 1), format="%Y-%m-%d")
weekday <- weekdays(as.Date(Date))
df_long <- data.frame(Date, weekday)
df_short<- df_long[ c(1:5, 8:12, 15), ]您可以使用dplyr::inner_join加入他们,从df_long中删除周末和假日,只保留工作日。
library(dplyr)
df_join <- df_long %>% inner_join(., df_short, by ="Date")
> df_join
Date weekday.x weekday.y
1 2003-03-03 Monday Monday
2 2003-03-04 Tuesday Tuesday
3 2003-03-05 Wednesday Wednesday
4 2003-03-06 Thursday Thursday
5 2003-03-07 Friday Friday
6 2003-03-10 Monday Monday
7 2003-03-11 Tuesday Tuesday
8 2003-03-12 Wednesday Wednesday
9 2003-03-13 Thursday Thursday
10 2003-03-14 Friday Friday
11 2003-03-17 Monday Mondayhttps://stackoverflow.com/questions/43024057
复制相似问题