我有以下数据框df
:
> head(df)
date demand
1 2019-09-21 6
2 2019-09-21 1
3 2019-09-21 9
4 2019-09-21 3
5 2019-09-21 12
6 2019-09-21 3
我希望它具有以下每小时粒度:
> head(df)
date demand
1 2019-09-21 00:00:00 6
2 2019-09-21 01:00:00 1
3 2019-09-21 02:00:00 9
4 2019-09-21 03:00:00 3
5 2019-09-21 04:00:00 12
6 2019-09-21 05:00:00 3
有没有办法在R中有效地做到这一点?我找到的最接近的答案是R Programming: Create hourly time intervals in an array with for loop和Matching and Replacing values of a column in a dataframe by date in r,但我似乎无法解决他们的问题。.一些见解将不胜感激!
备注:数据框中有多天,每天df
中包含24小时的日期。第一个日期应该是从凌晨12点(00:00:00)开始的小时,而最后一个日期应该是从11pm(23:00:00)开始的小时。
答案 0 :(得分:2)
大概这样会有所帮助:
library(dplyr)
df %>%
group_by(date) %>%
mutate(datetime = as.POSIXct(date) + 3600 * 0:(n() - 1))
#We can also use another variation suggested by @thelatemail
#mutate(datetime = as.POSIXct(date) + as.difftime(seq_len(n())-1, unit="hours"))
# date demand datetime
# <fct> <int> <dttm>
#1 2019-09-21 6 2019-09-21 00:00:00
#2 2019-09-21 1 2019-09-21 01:00:00
#3 2019-09-21 9 2019-09-21 02:00:00
#4 2019-09-21 3 2019-09-21 03:00:00
#5 2019-09-21 12 2019-09-21 04:00:00
#6 2019-09-21 3 2019-09-21 05:00:00
这也可以写在基数R中:
df$datetime <- with(df, ave(as.POSIXct(date), date,
FUN = function(x) x + 3600 * 0:(length(x) - 1)))