R-将每日格式的日期列转换为小时粒度

时间:2019-12-18 03:42:57

标签: r dataframe date datetime

我有以下数据框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 loopMatching and Replacing values of a column in a dataframe by date in r,但我似乎无法解决他们的问题。.一些见解将不胜感激!

备注:数据框中有多天,每天df中包含24小时的日期。第一个日期应该是从凌晨12点(00:00:00)开始的小时,而最后一个日期应该是从11pm(23:00:00)开始的小时。

1 个答案:

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