【问题标题】:R - Split time series into colums depending on weekdayR - 根据工作日将时间序列拆分为列
【发布时间】:2019-03-31 12:42:19
【问题描述】:

我有以下时间序列,显示 2017 年全年的 15 分钟电力负荷:

-Datum & Zeit`        kWh            
Sun Jan-01-2017 01:45  374.420
Sun Jan-01-2017 02:00  355.040
Sun Jan-01-2017 02:15  359.995
Sun Jan-01-2017 02:30  375.715
Sun Jan-01-2017 02:45  371.520
Sun Jan-01-2017 03:00  355.100
Sun Jan-01-2017 03:15  411.780
Sun Jan-01-2017 03:30  417.330
Sun Jan-01-2017 03:45  401.555
Sun Jan-01-2017 04:00  362.180
Sun Jan-01-2017 04:15  361.605
Sun Jan-01-2017 04:30  366.155
Sun Jan-01-2017 04:45  363.785
....
...
Sun Dec-31-2017 23:45  363.785

我现在想将其转换为矩阵,该矩阵仅选择特定工作日(此处为星期日)的时间戳并将其转换为列,以便我可以比较一年中特定日期的负载,这将结束最多 52 列。

  Sun Jan-01-2017    Sun Jan-08-2017   ....  Sun Dec-31-2017 23:45   
01:45  374.420            ...                ....
02:00  355.040            ...                ....
02:15  359.995            ...                ....
02:30  375.715            ...                ....
02:45  371.520            ...                ....
03:00  355.100            ...                ....
03:15  411.780            ...                ....
03:30  417.330            ...                ....
03:45  401.555            ...                ....
04:00  362.180            ...                ....
04:15  361.605            ...                ....
04:30  366.155            ...                ....
04:45  363.785            ...                ....
05:00  335.880            ...                ....

我该怎么做?

【问题讨论】:

  • 你应该试一试,然后你会遇到一个更具体的问题。

标签: r time-series xts zoo


【解决方案1】:

这样的 tidyverse 解决方案怎么样:

library(tidyverse)

long_data <- data.frame(Datum_and_Zeit = c("Sun Jan-01-2017 01:45", "Sun Jan-01-2017 02:00", "Sun Jan-01-2017 02:15", "Mon Jan-02-2017 01:45", "Mon Jan-02-2017 02:00", "Mon Jan-02-2017 02:15"), kWh = c(374.420, 355.040, 359.995, 375.715, 371.520, 355.100), stringsAsFactors = FALSE)

我使用了一小部分看起来像你的数据来说明。

wide_data <- long_data %>% 
separate(Datum_and_Zeit, into = c("Day", "Date", "Time"), sep = " ") %>% 
filter(Day == "Sun") %>% 
spread(Date, kWh) %>% 
select(-Day)

【讨论】:

  • 非常感谢!我不得不调整你的方法。
【解决方案2】:

这不是一个可重现的示例,但在将此数据集格式化为时间序列对象之前我会做些什么,我将使用 lubridate 的 wday() 函数创建一个列,然后使用 filter() 为你想要的日期创建一个子集喜欢排除。哦,还有,您需要确保在 POSIXct 中也有日期时间变量。

df <- mutate(df, wday= wday(TimeVar))
df.bizdays <- filter(df, wdat!= 1 & wday!=7)

然后我将简单地从该子集中重新创建时间序列对象。这也会使您的季节性更加复杂,因此我还会考虑使用 msts() 对象而不是 ts() 对象,特别是如果您想在分时进行分析。

希望有帮助!

【讨论】:

    【解决方案3】:

    我不得不采取一些不同的方法。

    不知何故,当我使用@david 方法时。出现“错误:var 必须计算为单个数字或列名,而不是列表”

    它还给了我以下输出 (2x53)

     Sun Jan-01-2017 01:45", "Sun Jan-01-2017 02:00", "Sun Jan-01-2017 02:15", ...
     SUN    74.420,             355.040,                359.995,               ....
    

    我创建了另一个数据框,将工作日、时间、日期和千瓦时分开

     Weekday   Time     Date         kWh
     Sun       01:45    Jan-01-2017  74.420
     Sun       02:45    Jan-01-2017  355.040
     ....
     ..
    
    
    dailys<- data.frame(Time,Weekday,Date,Load)
    dailys
    
    wide_data <- dailys %>% 
       filter(Weekday == "sun") %>% 
       spread(Time, kWh) %>% 
       select(-Date)
    

    我得到以下输出,非常接近。

    Weekday   Jan-01-2017   Jan-08-2017  Jan-015-2017 
    Sun         4.420,        455.040,     789.995,
    Sun          ...          ...         ...
    Sun          ...          ...          ..
    Sun
    ..
    ..
    

    现在我将 Weekday_Column 与时间戳列 (0:00; 00:15, 00:30,..., 23:45) 进行了交换,这可能不是最流畅的操作方式?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-20
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      相关资源
      最近更新 更多