如何为缺失时间的日期时间列补充00:00:00?
为缺失时间部分的日期添加00:00:00
我有一个包含日期时间列的数据框,该列按4小时间隔排列。当时间部分应为00:00:00(时:分:秒)时,日期中缺少时间部分。如何在时间缺失时为日期添加00:00:00?
示例数据
dat <- data.frame( dateTime = c('2016-07-01', '2016-07-01 04:00:00', '2016-07-01 08:00:00', '2016-07-01 12:00:00', '2016-07-01 16:00:00', '2016-07-01 20:00:00', '2016-07-02') ) str(dat) #> 'data.frame': 7 obs. of 1 variable: #> $ dateTime: chr "2016-07-01" "2016-07-01 04:00:00" "2016-07-01 08:00:00" "2016-07-01 12:00:00" ... dat #> dateTime #> 1 2016-07-01 #> 2 2016-07-01 04:00:00 #> 3 2016-07-01 08:00:00 #> 4 2016-07-01 12:00:00 #> 5 2016-07-01 16:00:00 #> 6 2016-07-01 20:00:00 #> 7 2016-07-02
原方法的局限性
我原本尝试过以下方法,但真实数据集存在缺失行,这种生成连续序列的方式会和原数据行不匹配,因此需要一种仅在时间缺失时添加00:00:00的替代方案。
library(tidyverse) dat <- dat %>% mutate(dateTime_cor = seq(from = as.POSIXct("2016-07-01 00:00:00"), to = as.POSIXct("2016-07-02 00:00:00"), by = "4 hours")) %>% select(-dateTime) str(dat) #> 'data.frame': 7 obs. of 1 variable: #> $ dateTime_cor: POSIXct, format: "2016-07-01 00:00:00" "2016-07-01 04:00:00" ... dat #> dateTime_cor #> 1 2016-07-01 00:00:00 #> 2 2016-07-01 04:00:00 #> 3 2016-07-01 08:00:00 #> 4 2016-07-01 12:00:00 #> 5 2016-07-01 16:00:00 #> 6 2016-07-01 20:00:00 #> 7 2016-07-02 00:00:00
解决方案
方法一:基础R逐行处理
通过判断字符串长度(纯日期字符串长度为10),仅对缺失时间的行补充00:00:00,再转换为日期时间类型:
# 补充时间部分 dat$dateTime_fixed <- ifelse(nchar(dat$dateTime) == 10, paste(dat$dateTime, "00:00:00"), dat$dateTime) # 转换为POSIXct日期时间类型 dat$dateTime_fixed <- as.POSIXct(dat$dateTime_fixed) # 查看结果 str(dat) #> 'data.frame': 7 obs. of 2 variables: #> $ dateTime : chr "2016-07-01" "2016-07-01 04:00:00" "2016-07-01 08:00:00" "2016-07-01 12:00:00" ... #> $ dateTime_fixed: POSIXct, format: "2016-07-01 00:00:00" "2016-07-01 04:00:00" ... dat #> dateTime dateTime_fixed #> 1 2016-07-01 2016-07-01 00:00:00 #> 2 2016-07-01 04:00:00 2016-07-01 04:00:00 #> 3 2016-07-01 08:00:00 2016-07-01 08:00:00 #> 4 2016-07-01 12:00:00 2016-07-01 12:00:00 #> 5 2016-07-01 16:00:00 2016-07-01 16:00:00 #> 6 2016-07-01 20:00:00 2016-07-01 20:00:00 #> 7 2016-07-02 2016-07-02 00:00:00
方法二:tidyverse工具链处理
使用case_when进行条件判断,结合tidyverse的管道风格处理:
library(tidyverse) dat <- dat %>% mutate( dateTime_fixed = case_when( # 匹配纯日期格式的字符串 nchar(dateTime) == 10 ~ paste(dateTime, "00:00:00"), # 其他情况保留原内容 TRUE ~ dateTime ) %>% as.POSIXct() )
这种逐行判断的方式不会受数据集缺失行的影响,仅针对时间缺失的行进行补充,完美适配需求。
内容的提问来源于stack exchange,提问作者tassones
相关产品推荐
相关产品推荐

