【问题标题】:Converting column to date type changes year of original value将列转换为日期类型会更改原始值的年份
【发布时间】:2019-12-27 22:00:42
【问题描述】:

我有一个数据框,我正在尝试将其中一列从字符值更改为日期值。我能够做到这一点,但列中的日期正在更改——而不是保留原始日期“2019 年 1 月 28 日”,而是将输出中的年份更改为“2020 年 1 月 28 日”。如何解决此问题以保留原始日期?

这是我的代码:

###create enddate column
df["enddate"] <- NA
df$enddate[df$filenames %like% "filename1"] <- "01/28/2019"
df$enddate[df$filenames %like% "filename2"] <- "02/25/2019"
df$enddate[df$filenames %like% "filename3"] <- "03/26/2019"

###change enddate column from character to date type
df$enddate <- as.Date(x = df$enddate, format = "%m/%d/%y")

【问题讨论】:

    标签: r dataframe types dplyr data-manipulation


    【解决方案1】:

    问题是%y 而不是%Y。年份是 4 位数字格式,根据?strptime(格式的文档有详细提及)

    %y 没有世纪的年份 (00–99)。在输入时,值 00 到 68 以 20 为前缀,69 到 99 以 19 为前缀——这是 2004 年和 2008 年 POSIX 标准指定的行为,但他们也说“预计在未来的版本中,默认世纪是从两位数的年份会发生变化。

    %Y 有世纪的年份。请注意,虽然原始公历中没有零,但 ISO 8601:2004 将其定义为有效(解释为 1BC):请参阅https://en.wikipedia.org/wiki/0_(year)。请注意,标准还规定,其日历中 1582 年之前的年份只能在有关各方同意的情况下使用。

    df$enddate <- as.Date(x = df$enddate, format = "%m/%d/%Y")
    

    另外,除了单独执行此操作之外,您还可以选择执行一次

    keydat <- data.frame(filenames = paste0('filename', 1:3), enddate = c("01/28/2019", "02/25/2019", "03/26/2019"), stringsAsFactors = FALSE)
    library(data.table)
    library(lubridate)
    setDT(df)[keydat, endddate := mdy(enddate), on = .(filenames)]
    

    【讨论】:

      猜你喜欢
      • 2015-07-27
      • 1970-01-01
      • 2020-12-21
      • 2015-08-15
      • 1970-01-01
      • 2019-10-12
      • 2020-01-23
      • 1970-01-01
      • 2019-12-27
      相关资源
      最近更新 更多