You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何标准化R数据框中PROG_START列的多种时间格式

解决R数据框中混合日期格式的标准化问题

问题分析

你的数据框PROG_START列包含两种日期格式:

  1. 文本格式:星期, 月, 日, 年(如Tuesday, October 1, 2019)
  2. 10位UTC时间戳(如1682294400,对应2023-04-24)

之前的代码失败原因:

  • 正则表达式错误:使用\\d{10}\\.\\d{3}匹配带毫秒的时间戳,但你的数据是10位整数时间戳,导致匹配失败
  • 日期解析函数选择错误:用dmy()处理文本日期,但文本格式是月在前,应该用mdy();时间戳分支未触发时,错误地用dmy()处理数字字符串,导致全NA

正确解决方案

使用dplyr和lubridate包,先区分日期类型,再分别解析,最后统一格式化:

# 加载必要包
library(dplyr)
library(lubridate)

# 原始数据
data <- data.frame(PROG_START = c("Tuesday, October 1, 2019", "1682294400"))

# 清洗并标准化日期
data_clean <- data %>%
  mutate(
    # 识别10位整数时间戳
    is_timestamp = str_detect(PROG_START, "^\\d{10}$"),
    # 分别解析两种格式的日期
    parsed_date = case_when(
      is_timestamp ~ as.POSIXct(as.numeric(PROG_START), origin = "1970-01-01", tz = "UTC"),
      TRUE ~ mdy(PROG_START) # mdy自动忽略星期,识别"月, 日, 年"格式
    ),
    # 格式化为"日-月-年"
    PROG_START = format(parsed_date, "%d-%m-%Y")
  ) %>%
  # 移除中间辅助列
  select(-is_timestamp, -parsed_date)

# 查看结果
print(data_clean)

输出结果

PROG_START
1 01-10-2019
2 24-04-2023

关键细节说明

  • str_detect(PROG_START, "^\\d{10}$"):精准匹配10位纯数字的时间戳,避免误匹配其他含数字的文本
  • mdy(PROG_START):lubridate的mdy()函数可以自动忽略文本中的星期部分,正确解析"Tuesday, October 1, 2019"为日期
  • as.POSIXct(as.numeric(PROG_START), origin = "1970-01-01", tz = "UTC"):将10位时间戳转换为UTC标准时间,确保年份正确(1682294400对应2023年而非1682年)

内容的提问来源于stack exchange,提问作者JonathonV92

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:46:14