【问题标题】:despite being in Date format lubridate "all formats failed to parse. No formats found" error when going from ymd to mdy尽管是日期格式 lubridate 从 ymd 到 mdy 时出现“所有格式都无法解析。未找到格式”错误
【发布时间】:2021-02-28 00:39:01
【问题描述】:

编辑:已被告知 lubridate 不会进行任何转换。

我有一个非常简单的变量,其 YMD 日期为 chr 格式,但 lubridate::mdy() 拒绝将其转换为 mdy(如果这不是 mdy 应该做的,那么请建议如何使用 lubridate更改数据排序)。我截断了它以摆脱时间,我可以将 as_date 应用到截断的版本而不会出错,所以我最终得到了六个 Date 级别:

          .  n   percent
 2020-05-20  6 0.0400000
 2020-05-21 19 0.1266667
 2020-05-25 45 0.3000000
 2020-05-26 47 0.3133333
 2020-05-27 21 0.1400000
 2020-06-04 12 0.0800000

但是任何转换为​​ mdy() 的尝试 after as_date 已经使用 lubridate 实现了 Warning message: All formats failed to parse. No formats found. 怎么会这样?我翻遍了之前的 lubridate 帖子,不明白为什么简单的格式更改总是失败。

我已经尝试过 base 和 tidyverse 版本的 test$StartDate2 <- mdy(test$StartDate2) 他们转向 NAs

原始数据test$StartDate: chr [1:150] "2020-05-25 16:11" ... 被截断为test$StartDate2: chr [1:150] "2020-05-25" "2020-05-27" 然后通过test$StartDate2 <- as_date(test$StartDate2) 仍然没有被mdy() 识别

test %>% mutate(StartDate3 = as_date(StartDate2),
+                 StartDate4 = ymd(StartDate2),
+                 StartDate5 = mdy(StartDate2))
# A tibble: 150 x 5
   StartDate        StartDate2 StartDate3 StartDate4 StartDate5
   <chr>            <date>     <date>     <date>     <date>    
 1 2020-05-25 16:11 2020-05-25 2020-05-25 2020-05-25 NA        
 2 2020-05-27 6:55  2020-05-27 2020-05-27 2020-05-27 NA        
 3 2020-05-25 16:41 2020-05-25 2020-05-25 2020-05-25 NA        
 4 2020-05-27 5:58  2020-05-27 2020-05-27 2020-05-27 NA        
 5 2020-05-26 1:28  2020-05-26 2020-05-26 2020-05-26 NA        
 6 2020-05-25 16:51 2020-05-25 2020-05-25 2020-05-25 NA        
 7 2020-05-26 21:11 2020-05-26 2020-05-26 2020-05-26 NA        
 8 2020-05-25 16:08 2020-05-25 2020-05-25 2020-05-25 NA        
 9 2020-05-25 14:38 2020-05-25 2020-05-25 2020-05-25 NA        
10 2020-05-26 21:56 2020-05-26 2020-05-26 2020-05-26 NA     

【问题讨论】:

  • 当您尝试从字符串转换时,任何已经在 DatePOSIXt 类中的内容都将被静默转换为 charactermdy 假定它的字符串将以类似月份的事物开头并以类似年份的事物结尾,但 R 的默认 character 日期表示形式类似于 2021-02-26
  • 对于您的StartDate 专栏,您是否尝试过简单的as.POSIXct(c("2020-05-27 6:55", "2020-05-25 16:11"), format = "%Y-%m-%d %H:%M")
  • 你认为mdy("2020-05-26") 有意义吗?(听起来很刺耳,改写了...)mdy 不是幂等的,所以它不检查它的输入是否已经是Date 类。因此,输入被转换为字符串,所以它看到mdt("2020-05-26"),其中月份是最后一个月,而不是第一个月,正如mdy 所期望的那样。
  • 不,我知道不是,我正在尝试将它放入 mdy。 mdy 的想法是告诉我一些我可以轻松观察或转换数据的东西吗?我已经在数据的 chr 和 Date 版本上尝试了 mdy 并得到了相同的结果。
  • 已经日期格式的可以ymd处理。请注意,mdy(Sys.Date()) 失败,ymd(Sys.Date()) 成功。

标签: r date dplyr lubridate


【解决方案1】:

所有lubridate 函数(mdyymd 或任何其他函数)都用于将值从字符类型更改为日期类型。日期类型只能以一种形式表示,即YYYY-MM-DD。如果您想要任何其他格式的日期,那么您可能需要具有字符类型的值。要获取其他形式的数据,您可以使用format(而不是mdy)。

library(dplyr)
test %>% mutate(StartDate3 = format(StartDate2, '%m-%d-%Y'))

#          StartDate StartDate2 StartDate3
#1  2020-05-25 16:11 2020-05-25 05-25-2020
#2   2020-05-27 6:55 2020-05-27 05-27-2020
#3  2020-05-25 16:41 2020-05-25 05-25-2020
#4   2020-05-27 5:58 2020-05-27 05-27-2020
#5   2020-05-26 1:28 2020-05-26 05-26-2020
#6  2020-05-25 16:51 2020-05-25 05-25-2020
#7  2020-05-26 21:11 2020-05-26 05-26-2020
#8  2020-05-25 16:08 2020-05-25 05-25-2020
#9  2020-05-25 14:38 2020-05-25 05-25-2020
#10 2020-05-26 21:56 2020-05-26 05-26-2020

【讨论】:

  • 如果我是正确的,我认为“mdy”或“ymd”调用用于指定格式进入 lubridate 的日期,并且 lubridate 总是吐出 ymd。是对的吗?我认为有些人会被绊倒,因为他们认为进入 lubridate 的“mdy”是您告诉 lubridate 去做的事情,而不是 lubridate 试图阅读的内容?
  • 是的,你是对的。 mdyymddmy 指定输入类型。输出类型始终为ymd
  • @hachiko 这正是发生在我身上的事情。感谢 Ronak 的澄清和建议。遇到一个 tidyverse 包不能转换数据是很不寻常的,我只是希望它像其他 tidyverse 包一样。
  • 我有一种感觉,就是这样! lubridate 应该被称为 ymd 包
猜你喜欢
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 2017-09-10
相关资源
最近更新 更多