R语言字符型时间列转日期时间格式报错,如何计算时间差?
问题原因
你之前的转换报错核心原因是指定的时间格式字符串和实际数据格式不匹配:
- 数据的时间分隔符是
/,但部分尝试用了-作为分隔符 - 数据的年份是2位缩写(比如
21代表2021),但部分尝试用了代表4位年份的%Y - 数据没有秒级字段,不需要加
%OS格式符
解决方案
方案1:使用lubridate包(更便捷)
lubridate的mdy_hm()函数专门适配「月/日/年 时:分」格式的字符转日期时间,无需手动写复杂格式串:
library(tidyverse) library(lubridate) sep_2021 <- sep_2021 %>% mutate( # 转换两列为日期时间类型,时区请按数据集实际所属区域调整,示例为美国芝加哥时区 started_at = mdy_hm(started_at, tz = "America/Chicago"), ended_at = mdy_hm(ended_at, tz = "America/Chicago"), # 计算骑行时长,单位为分钟 ride_length = as.numeric(difftime(ended_at, started_at, units = "mins")) )
方案2:使用R基础包
手动指定匹配的格式串%m/%d/%y %H:%M转换即可:
library(tidyverse) sep_2021 <- sep_2021 %>% mutate( started_at = as.POSIXct(started_at, format = "%m/%d/%y %H:%M", tz = "America/Chicago"), ended_at = as.POSIXct(ended_at, format = "%m/%d/%y %H:%M", tz = "America/Chicago"), ride_length = as.numeric(difftime(ended_at, started_at, units = "mins")) )
校验建议
转换完成后可先执行head(sep_2021[,c("started_at","ended_at","ride_length")])检查结果是否符合预期,如果出现NA值,可执行which(is.na(sep_2021$started_at))定位异常行,排查对应行的时间格式是否存在特殊错误。
内容的提问来源于stack exchange,提问作者Nick Mirante
相关产品推荐
相关产品推荐

