【问题标题】:Create future time stamps for each combination of parameters为每个参数组合创建未来时间戳
【发布时间】:2018-10-28 00:56:40
【问题描述】:

我想知道如何为每个参数组合(BranchId、Hour、weekdays)创建未来的时间戳

BranchId      Hour   weekdays     ActivityDate     Total   
    1          11      3      2018-02-06T00:00:00   18
    1          11      3      2018-02-13T00:00:00   23
    1          12      3      2018-02-06T00:00:00   15
    1          12      3      2018-02-13T00:00:00   13
    1          13      3      2018-02-06T00:00:00   24
    1          13      3      2018-02-13T00:00:00   22

目前我只能为一种组合创建未来的时间戳,如下所示:

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")

当我应用此代码时结果出现错误,它不会为每个组合创建未来的时间戳:

BranchId    Hour    weekdays    ActivityDate      Total
   1         11        3    2018-02-06T00:00:00Z    18
   1         11        3    2018-02-13T00:00:00Z    23
   1         12        3    2018-02-20T00:00:00Z    
   1         12        3    2018-02-27T00:00:00Z    
   1         13        3    2018-03-06T00:00:00Z    
   1         13        3    2018-03-13T00:00:00Z    

我需要生成多个函数还是 for 循环来处理它?

【问题讨论】:

  • 对不起,我在想这是否可以通过python来完成。
  • R和python都可以实现
  • @Wen 如何修改上面的代码来实现?你能给我一些建议吗?

标签: r machine-learning timestamp time-series


【解决方案1】:

在 R 中完整

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

【讨论】:

  • 谢谢文!我想知道如果工作日不同怎么办,这意味着最后一个 ActivityDate 不会相同。
【解决方案2】:

使用 R,您可以使用以下代码创建具有每周间隔的额外日期。使用包padr 中的函数pad,您可以定义将日期添加到data.frame 的时间间隔。使用 group 选项告诉函数应该使用哪些变量来创建新的时间线或填写缺失的日期。您可以指定开始日期和结束日期,以便采用介于两者之间的所有日期,否则它将是 data.frame 中可用的 minmax 日期。

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))

【讨论】:

  • 谢谢你,phiver。我收到此错误object of type 'closure' is not subsettable,我认为它来自 as.Date。如果工作日不同,也就是说activitydate的最后一个不一样,我该如何修改max.date?
  • 请注意,我的 data.frame 被称为 df,而不是 data。错误可能在 min.date 行。你可以为 max.date 选择任何你想要的。但如果您有不同的工作日,您可能需要先延长活动日期,然后计算工作日数。
  • 是的,我已经更改了它们并确保它们中的每一个都指向正确的东西,但这就是我得到的,invalid tz ...
猜你喜欢
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
相关资源
最近更新 更多