如何为每2&3行添加15分钟间隔到日期时间序列

时间:2017-05-12 04:54:26

标签: r

我的数据框如下

    Date_time        name
  11/1/2016 6:00      A
  11/1/2016 6:00      A
  11/1/2016 6:00      A
  11/1/2016 6:45      A
  11/2/2016 11:00     B
  11/2/2016 11:00     B
  11/2/2016 11:00     B
  11/2/2016 11:45     B

以上df应该在15区间内 我们在00分钟后结,下一个应该是15& 30& 45个间隔 O / p应该是

Date_time        name   New_Date_time
  11/1/2016 6:00      A       11/1/2016 6:00 
  11/1/2016 6:00      A       11/1/2016 6:15     
  11/1/2016 6:00      A       11/1/2016 6:30     
  11/1/2016 6:45      A       11/1/2016 6:45     
  11/2/2016 11:00     B       11/2/2016 11:00    
  11/2/2016 11:00     B       11/2/2016 11:15
  11/2/2016 11:00     B       11/2/2016 11:30  
  11/2/2016 11:45     B       11/2/2016 11:45    

提前致谢

1 个答案:

答案 0 :(得分:0)

我假设您的变量Date_time是一个字符,并且每个name始终有4个观察值。然后,您可以执行以下操作:

## Your data:
df <-  structure(list(Date_time = c("11/1/2016 6:00", "11/1/2016 6:00", 
    "11/1/2016 6:00", "11/1/2016 6:45", "11/2/2016 11:00", "11/2/2016 11:00", 
    "11/2/2016 11:00", "11/2/2016 11:45"), name = c("A", "A", "A", 
    "A", "B", "B", "B", "B")), .Names = c("Date_time", "name"), 
    class = "data.frame", row.names = c(NA, -8L))

library(dplyr)
library(lubridate)
df <- df %>%
        dplyr::mutate(Date_time = as.POSIXct(Date_time, format = "%m/%d/%Y %H:%M")) %>% 
        group_by(name) %>% 
        dplyr::mutate(New_Date_time = min(Date_time) + lubridate::minutes(c(0,15,30,45)))

df
# Source: local data frame [8 x 3]
# Groups: name [2]
# 
#             Date_time  name       New_Date_time
#                <dttm> <chr>              <dttm>
# 1 2016-11-01 06:00:00     A 2016-11-01 06:00:00
# 2 2016-11-01 06:00:00     A 2016-11-01 06:15:00
# 3 2016-11-01 06:00:00     A 2016-11-01 06:30:00
# 4 2016-11-01 06:45:00     A 2016-11-01 06:45:00
# 5 2016-11-02 11:00:00     B 2016-11-02 11:00:00
# 6 2016-11-02 11:00:00     B 2016-11-02 11:15:00
# 7 2016-11-02 11:00:00     B 2016-11-02 11:30:00
# 8 2016-11-02 11:45:00     B 2016-11-02 11:45:00

修改

如果观察数量不同,则只需将c(0,15,30,45)替换为seq(from = 0, by = 15, length.out = n()),即:

df <- df %>%
        dplyr::mutate(Date_time = as.POSIXct(Date_time, format = "%m/%d/%Y %H:%M")) %>% 
        group_by(name) %>% 
        dplyr::mutate(New_Date_time = min(Date_time) + 
                        lubridate::minutes(seq(from = 0, by = 15, length.out = n())))