【发布时间】: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
【问题讨论】:
-
当您尝试从字符串转换时,任何已经在
Date或POSIXt类中的内容都将被静默转换为character。mdy假定它的字符串将以类似月份的事物开头并以类似年份的事物结尾,但 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())成功。