【问题标题】:Why is R converting date formats erroneously?为什么 R 会错误地转换日期格式?
【发布时间】:2021-08-05 15:16:18
【问题描述】:

将日期格式从年和周转换为 yyyy/mm/dd 时出现一个奇怪的错误。在我的数据集中,我有一个变量,其日期格式为“2020-W20”,用于 2020 年和 2021 年的多个星期。当我转换它时,R 仅将所有日期转换为 2020/05/15 和 2021/05/ 15.有什么想法可能会发生吗?

vaccine_data <- read.csv(
  "https://opendata.ecdc.europa.eu/covid19/vaccine_tracker/csv/data.csv",
  na.strings = "",
  fileEncoding = "UTF-8-BOM"
)

vaccine_data$date_yyyymmdd <- unique(
  strftime(
    strptime(vaccine_data$YearWeekISO, format = "%Y-W%U"), 
    format = "%Y/%m/%d"
  )
)

【问题讨论】:

  • 请添加一些数据:“一个最小可重现示例 (MRE) 应该能让其他人在他们的机器上准确重现您的问题”stackoverflow.com/questions/5963269/…
  • 这是一个可重复的问题(尽管它依赖于外部数据:只给出一个简短的样本日期的 sn-p 会更简单、更可重复)。

标签: r date format


【解决方案1】:

这很棘手。有两个问题:

  • 日期/日期时间转换例程没有“仅年/周”日期的概念。因此,您需要附加指定的星期几(例如,0 或 1 表示一周的第一天,具体取决于约定)以获取日期。
  • R 使用的用于日期转换的系统库(它通常不使用自己的,而是包装系统库)通常没有 ISO 周约定编码(请参阅?strptime 的详细信息,尤其是在描述“%V”格式,它说 “接受但在输入时忽略” - 即它只是不起作用。因此,我使用了stringi 包,它使用了独立的ICU 实现日期转换。 (它确实给出了关于“格式化程序 %U、%V、%x、%X、%u、%w、%r、%g、%G、%c 可能不是 100% 与 ICU 兼容”的警告,所以你一定要检查你的结果!)

这似乎是一个解决方案,尽管您应该自己检查周初日期并可能从中减去 1,如果您得到星期一但想要星期日(我没有检查)。 (我最初尝试在字符串中添加“-0”,这对 R 来说很好,但 stringi 函数不喜欢它。)

library(stringi)
w <- vaccine_data$YearWeekISO
sfmt <- stri_datetime_fstr('%Y-W%V-%w')
d <- as.Date(stri_datetime_parse(
                    sprintf("%s-1",w), format = sfmt))

之前在 R 中的尝试,它给出了“2020-W53”的 NA 值(因为我使用的是英国惯例“%W”,而不是不工作的“%V”格式)

s <- sprintf("%s-0",w)
d <- strptime(s, format="%Y-W%W-%w")
unique(w[which(is.na(d))])
## [1] "2020-W53"

您可以将 NA 值替换为您想要的日期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多