如何在R中转换多格式字符日期列并计算间隔小时数?
解决方案
可以借助lubridate和dplyr包批量处理这些格式混杂的日期与小时数据,以下是完整实现代码:
library(dplyr) library(lubridate) library(stringr) # 加载数据集 df <- structure(list(Dates = c("1h", "10 Std.", "Apr 5", "Dec 8, 2022", "May 30, 2019", "6. Juni 2021", NA, "15. März", "13. Aug. 2019" )), class = "data.frame", row.names = c(NA, -9L)) # 设置德语区域,用于解析德式日期 locale("de_DE.UTF-8") result_df <- df %>% mutate( # 提取小时格式的数字值 hour_val = case_when( str_detect(Dates, "^\\d+h$") ~ as.numeric(str_extract(Dates, "\\d+")), str_detect(Dates, "^\\d+ Std\\.$") ~ as.numeric(str_extract(Dates, "\\d+")), TRUE ~ NA_real_ ), # 解析各类日期格式,补全缺失年份 parsed_date = case_when( # 带年份的德式日期(如6. Juni 2021、13. Aug. 2019) str_detect(Dates, "^\\d+\\. \\w+.*\\d{4}$") ~ dmy(Dates, locale = "de_DE.UTF-8"), # 无年份的德式日期(如15. März) str_detect(Dates, "^\\d+\\. \\w+$") ~ dmy(paste0(Dates, " ", year(today())), locale = "de_DE.UTF-8"), # 带年份的英式日期(如Dec 8, 2022) str_detect(Dates, "^\\w+ \\d+, \\d{4}$") ~ mdy(Dates), # 无年份的英式日期(如Apr 5) str_detect(Dates, "^\\w+ \\d+$") ~ mdy(paste0(Dates, ", ", year(today()))), TRUE ~ NA_Date_ ), # 生成最终的Dates列:小时行保留原字符串,日期行转为yyyy-mm-dd格式 final_dates = case_when( !is.na(hour_val) ~ Dates, !is.na(parsed_date) ~ format(parsed_date, "%Y-%m-%d"), TRUE ~ NA_character_ ), # 计算Time_since列 Time_since = case_when( !is.na(hour_val) ~ hour_val, !is.na(parsed_date) ~ as.numeric(difftime(today(), parsed_date, units = "hours")), TRUE ~ NA_real_ ) ) %>% select(Dates = final_dates, Time_since) # 打印结果(NA显示为"NA") print(result_df, na.print = "NA")
关键逻辑说明
- 小时格式识别:通过正则匹配
Xh和X Std.两种模式,提取数字作为小时数。 - 日期解析与补全:
- 德式日期用
dmy()结合德语区域解析,无年份的自动补充当前年份; - 英式日期用
mdy()解析,无年份的同样补充当前年份。
- 德式日期用
- 格式统一:将解析后的日期转为
yyyy-mm-dd标准格式,小时类数据保留原字符串。 - 时间间隔计算:日期类数据计算与当前日期的小时差,小时类数据直接使用提取的数值。
注意:若系统不支持de_DE.UTF-8区域,可尝试替换为本地支持的德语区域标识(如"de_DE")。
内容的提问来源于stack exchange,提问作者Soph2010
相关产品推荐
相关产品推荐

