大数据集下如何将char类型列转为datetime类型并解决解析错误问题
问题根因分析
出现转换结果和预期不符主要有两个核心原因:
- 指定的解析格式
ymd HMS和原started_at列的实际字符格式不匹配:要么是年份为2位而非4位,要么是时间为12小时制而非24小时制,要么是原字符串中存在多余空格/特殊字符干扰解析 - 输出格式默认带完整24小时制时间和4位补全年份,和期望的输出格式不一致
具体解决步骤
第一步:清理原字符列的多余空格
先把原列里的多余空格全部去掉,避免干扰解析:
c_data$started_at <- stringr::str_squish(c_data$started_at)
第二步:调整解析格式匹配原数据
根据给出的预期结果反推,原数据大概率是2位年份、12小时制时间,根据实际情况选择对应解析代码:
# 情况1:原数据为2位年+月日+小时分钟 例:"200520 10:03" c_data$dt_1 <- lubridate::parse_date_time(c_data$started_at, "y md HM") # 情况2:原数据带AM/PM标识 例:"2020-05-20 10:03 AM" c_data$dt_1 <- lubridate::parse_date_time(c_data$started_at, "ymd HM %p") # 情况3:确认解析后年份统一偏移(比如所有年份多了7年),批量修正 c_data$dt_1 <- c_data$dt_1 - lubridate::years(7)
第三步:按期望格式输出
如果需要最终输出为2020-05-20 10:03格式的字符串,用format函数指定输出格式:
c_data$dt_output <- format(c_data$dt_1, "%Y-%m-%d %H:%M")
验证方法
取前几行原数据和转换后的数据对比,确认解析正确:
head(data.frame(original = c_data$started_at, parsed = c_data$dt_1, output = c_data$dt_output))
内容的提问来源于stack exchange,提问作者Nikhil
相关产品推荐
相关产品推荐

