R - 根据工作日将时间序列分成列
R - Split time series into colums depending on weekday
我有以下时间序列,显示了 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 ... ....
我该怎么做?
这不是一个可重现的示例,但在将此数据集格式化为时间序列对象之前我会做些什么,我会使用 lubridate 的 wday() 函数创建一个列,然后使用 filter() 对天数进行子集化你想排除。哦,还有,您需要确保在 POSIXct 中也有日期时间变量。
df <- mutate(df, wday= wday(TimeVar))
df.bizdays <- filter(df, wdat!= 1 & wday!=7)
然后我将简单地从该子集重新创建时间序列对象。这也会使您的季节性更加复杂,因此我也会考虑使用 msts() 对象而不是 ts() 对象,特别是如果您想在次小时标记处进行分析。
希望对您有所帮助!
像这样的 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)
我不得不采取一些不同的方法。
当我使用@david 方法时不知何故。有 "Error: var
must evaluate to a single number or a column name, not a list"
此外,它给了我以下输出 (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, ....
我创建了另一个数据框,我在其中拆分了工作日、时间、日期和 kwh
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) 交换,这可能不是最流畅的方式?
我有以下时间序列,显示了 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 ... ....
我该怎么做?
这不是一个可重现的示例,但在将此数据集格式化为时间序列对象之前我会做些什么,我会使用 lubridate 的 wday() 函数创建一个列,然后使用 filter() 对天数进行子集化你想排除。哦,还有,您需要确保在 POSIXct 中也有日期时间变量。
df <- mutate(df, wday= wday(TimeVar))
df.bizdays <- filter(df, wdat!= 1 & wday!=7)
然后我将简单地从该子集重新创建时间序列对象。这也会使您的季节性更加复杂,因此我也会考虑使用 msts() 对象而不是 ts() 对象,特别是如果您想在次小时标记处进行分析。
希望对您有所帮助!
像这样的 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)
我不得不采取一些不同的方法。
当我使用@david 方法时不知何故。有 "Error: var
must evaluate to a single number or a column name, not a list"
此外,它给了我以下输出 (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, ....
我创建了另一个数据框,我在其中拆分了工作日、时间、日期和 kwh
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) 交换,这可能不是最流畅的方式?