R 为每个参数组合创建未来的时间戳
我想知道如何为每个参数组合(BranchId、Hour、weekdays)创建未来的时间戳 目前,我只能为一个组合创建未来时间戳,如下所示:R 为每个参数组合创建未来的时间戳,r,machine-learning,timestamp,time-series,R,Machine Learning,Timestamp,Time Series,我想知道如何为每个参数组合(BranchId、Hour、weekdays)创建未来的时间戳 目前,我只能为一个组合创建未来时间戳,如下所示: BranchId Hour weekdays ActivityDate Total 1 11 3 2018-02-06T00:00:00Z 18 1 11 3 2018-02-13T00:00:00Z 23 1
BranchId Hour weekdays ActivityDate Total
1 11 3 2018-02-06T00:00:00Z 18
1 11 3 2018-02-13T00:00:00Z 23
1 11 3 2018-02-20T00:00:00Z
1 11 3 2018-02-27T00:00:00Z
1 11 3 2018-03-06T00:00:00Z
1 11 3 2018-03-13T00:00:00Z
代码是:
min.date <- min(data$ActivityDate)
max.date <- max(data$ActivityDate)
unique.time <- seq(from = min.date, to = max.date, by = "week")
forecast.time <- seq(from = max.date, by = observation.freq, length.out = 4 + 1)[-1]
all.time <- c(unique.time, forecast.time)
all.time <- data.frame(BranchId = data$BranchId[1], Hour = data$Hour[1], weekdays = data$weekdays[1],ActivityDate = all.time)
# Join the combination with original data
data <- join(all.time, data, by = c("BranchId","Hour", "weekdays", "ActivityDate"), type = "left")
我是否需要生成多个函数或循环来实现它?使用R,您可以使用以下代码创建每周间隔的额外日期。使用软件包
padr
中的功能pad
,您可以定义将日期添加到data.frame的时间间隔。使用“组”选项告诉函数应使用哪些变量创建新的时间线或填写缺失的日期。您可以指定开始日期和结束日期,以便在这两个日期之间选择所有日期,否则它将是data.frame中可用的min
和max
日期
min.date <- min(df$ActivityDate)
max.date <- as.Date("2018-03-13T00:00:00Z")
library(padr)
df <- pad(df, interval = "week" , start_val = min.date, end_val = max.date, group = c("BranchId", "Hour", "weekdays"))
# this step can be skipped if you want to keep NA's instead of 0
df <- fill_by_value(df, value = 0)
df
BranchId Hour weekdays ActivityDate Total
1 1 11 3 2018-02-06 18
2 1 11 3 2018-02-13 23
3 1 11 3 2018-02-20 0
4 1 11 3 2018-02-27 0
5 1 11 3 2018-03-06 0
6 1 11 3 2018-03-13 0
7 1 12 3 2018-02-06 15
8 1 12 3 2018-02-13 13
9 1 12 3 2018-02-20 0
10 1 12 3 2018-02-27 0
11 1 12 3 2018-03-06 0
12 1 12 3 2018-03-13 0
13 1 13 3 2018-02-06 24
14 1 13 3 2018-02-13 22
15 1 13 3 2018-02-20 0
16 1 13 3 2018-02-27 0
17 1 13 3 2018-03-06 0
18 1 13 3 2018-03-13 0
R中的min.date
df%>%group_by(BranchId,Hour,weekdays)%>%complete(ActivityDate = seq.Date(min(ActivityDate), min(ActivityDate)+42, by="week"),fill=list(Total=0))
# A tibble: 21 x 5
# Groups: BranchId, Hour, weekdays [3]
BranchId Hour weekdays ActivityDate Total
<int> <int> <int> <date> <dbl>
1 1 11 3 2018-02-06 18
2 1 11 3 2018-02-13 23
3 1 11 3 2018-02-20 0
4 1 11 3 2018-02-27 0
5 1 11 3 2018-03-06 0
6 1 11 3 2018-03-13 0
7 1 11 3 2018-03-20 0
8 1 12 3 2018-02-06 15
9 1 12 3 2018-02-13 13
10 1 12 3 2018-02-20 0
df%>%groupby(BranchId,Hour,weekday)%%>%complete(ActivityDate=seq.Date(min(ActivityDate),min(ActivityDate)+42,by=“week”),fill=list(Total=0))
#A tibble:21x5
#分组:布兰奇、小时、工作日[3]
BranchId小时工作日活动日期总计
1 1 11 3 2018-02-06 18
2 1 11 3 2018-02-13 23
3 1 11 3 2018-02-20 0
4 1 11 3 2018-02-27 0
5 1 11 3 2018-03-06 0
6 1 11 3 2018-03-13 0
7 1 11 3 2018-03-20 0
8 1 12 3 2018-02-06 15
9 1 12 3 2018-02-13 13
10 1 12 3 2018-02-20 0
对不起,我在想这是否可以由python完成。R和python都可以achieve@Wen如何修改上面的代码来实现?你能给我一些建议吗?谢谢你,菲弗。我发现此错误类型为“closure”的对象不可子集
,我认为它来自as.Date。如果工作日不同,这意味着activitydate的最后一个日期不一样,我如何修改max.date?请注意,我的data.frame称为df,而不是data。错误可能在min.date行。您可以为max.date选择任何您想要的内容。但是如果你有不同的工作日,你可能想先延长你的活动日期,然后计算工作日数。是的,我已经更改了它们,并确保每个都指向正确的东西,但这就是我得到的,无效的tz
…谢谢你!我想知道如果工作日不同,这意味着最后一个活动日期会不一样,会怎么样。
min.date <- min(df$ActivityDate)
max.date <- as.Date("2018-03-13T00:00:00Z")
library(padr)
df <- pad(df, interval = "week" , start_val = min.date, end_val = max.date, group = c("BranchId", "Hour", "weekdays"))
# this step can be skipped if you want to keep NA's instead of 0
df <- fill_by_value(df, value = 0)
df
BranchId Hour weekdays ActivityDate Total
1 1 11 3 2018-02-06 18
2 1 11 3 2018-02-13 23
3 1 11 3 2018-02-20 0
4 1 11 3 2018-02-27 0
5 1 11 3 2018-03-06 0
6 1 11 3 2018-03-13 0
7 1 12 3 2018-02-06 15
8 1 12 3 2018-02-13 13
9 1 12 3 2018-02-20 0
10 1 12 3 2018-02-27 0
11 1 12 3 2018-03-06 0
12 1 12 3 2018-03-13 0
13 1 13 3 2018-02-06 24
14 1 13 3 2018-02-13 22
15 1 13 3 2018-02-20 0
16 1 13 3 2018-02-27 0
17 1 13 3 2018-03-06 0
18 1 13 3 2018-03-13 0
df <- structure(list(BranchId = c(1L, 1L, 1L, 1L, 1L, 1L),
Hour = c(11L, 11L, 12L, 12L, 13L, 13L),
weekdays = c(3L, 3L, 3L, 3L, 3L, 3L),
ActivityDate = as.Date(c("2018-02-06T00:00:00", "2018-02-13T00:00:00","2018-02-06T00:00:00",
"2018-02-13T00:00:00", "2018-02-06T00:00:00", "2018-02-13T00:00:00")),
Total = c(18L, 23L, 15L, 13L, 24L, 22L)),
.Names = c("BranchId", "Hour", "weekdays", "ActivityDate", "Total"),
class = "data.frame", row.names = c(NA, -6L))
df%>%group_by(BranchId,Hour,weekdays)%>%complete(ActivityDate = seq.Date(min(ActivityDate), min(ActivityDate)+42, by="week"),fill=list(Total=0))
# A tibble: 21 x 5
# Groups: BranchId, Hour, weekdays [3]
BranchId Hour weekdays ActivityDate Total
<int> <int> <int> <date> <dbl>
1 1 11 3 2018-02-06 18
2 1 11 3 2018-02-13 23
3 1 11 3 2018-02-20 0
4 1 11 3 2018-02-27 0
5 1 11 3 2018-03-06 0
6 1 11 3 2018-03-13 0
7 1 11 3 2018-03-20 0
8 1 12 3 2018-02-06 15
9 1 12 3 2018-02-13 13
10 1 12 3 2018-02-20 0