使用具有多种日期格式的 lubridate

Using lubridate with multiple date formats

我有一列日期以 8/7/200110/21/1990 等格式存储。两个值只是四位数年份。我使用以下代码将整个列转换为 class Date

lubridate::parse_date_time(eventDate, orders = c('mdy', 'Y'))

效果很好,只是年的值被转换为 yyyy-01-01,我希望它们只是 yyyy。有没有办法阻止 lubridate 添加任何不存在的信息?

编辑:创建数据框的代码

    id = (1:5)
    eventDate = c("10/7/2001", "1989", NA, "5/5/2016", "9/18/2011")
    df <- data.frame(id, eventDate)

我认为无法将您的值转换为日期,并保持“yyyy”值不变。通过将您的“yyyy”值转换为“yyyy-01-01”,lubridate 正在做正确的事情。因为日期是有顺序的,如果您的列中有其他值定义了日期和月份,则所有其他值也需要具有这些组件。

例如。如果我生成下面的 data.frame。如果我问 R,要根据日期列对 table 进行排序,第一行中的日期(“2020”)在第二行中的值(“2020-02-28”)之前?还是紧随其后?值“2020”是2020年,它实际上可以表示这一年中的每一天,那么R应该如何对待呢?通过添加一年的第一天,lubridate 定义了这些组件,并避免 R 被它混淆。

dates <- c("2020", "2020-02-28", "2020-02-20", "2020-01-10", "2020-05-12")
id <- 1:5

df <- data.frame(
  id,
  dates
)

  id      dates
1  1       2020
2  2 2020-02-28
3  3 2020-02-20
4  4 2020-01-10
5  5 2020-05-12

因此,如果您想保持“yyyy”完好无损,它们很可能不应与其他结构不同的值一起放在 eventDate 列中(dd/mm/yyyy ”)。现在,如果真的有必要完整地保留这些值,我认为最好将 eventDate 列的值保留为字符,并将这些值作为日期存储在另一列中,如下所示:

df$as_dates <- lubridate::parse_date_time(df$eventDate, orders = c('mdy', 'Y'))

  id eventDate   as_dates
1  1 10/7/2001 2001-10-07
2  2      1989 1989-01-01
3  3      <NA>       <NA>
4  4  5/5/2016 2016-05-05
5  5 9/18/2011 2011-09-18