使用 `anytime` 猜测 dfs 列表中的日期

问题描述 投票:0回答:1

模拟数据:

my_list <- list(structure(list(start = c("2023-09-12T18:59:49.336+01:00", "2023-09-18 07:29:34", "z2023-09-18 07:29:34")), class = "data.frame", row.names = c(NA, -3L)), structure(list(start = c("2023-09-16T21:12:51.288Z", "2019-11-30", "2019-30-11")), class = "data.frame", row.names = c(NA, -3L)))

使用这个问题的第二个答案(请注意,第一个答案对我不起作用),我想将所有日期转换为年-月-日。

我愿意:

library(anytime)
lapply(my_list, transform,
       start = anydate(start)
)

输出:

[[1]]
       start
1 2023-09-12
2 2023-09-18
3       <NA>

[[2]]
       start
1 2023-09-16
2 2019-11-30
3       <NA>

正如人们所看到的,它不适用于两个日期,这两个日期被强制为 NA。请注意,我的真实数据有数十个 dfs 和数千个日期,没有独特的格式。

我们如何做到这一点?所需输出:

[[1]]
       start
1 2023-09-12
2 2023-09-18
3 2023-09-18

[[2]]
       start
1 2023-09-16
2 2019-11-30
3 2019-11-30      
r list date
1个回答
0
投票

采用

parse_date_time
的方法。使用
gsub
提取字符串的日期部分。

library(lubridate)

lapply(my_list, \(x) data.frame(start = 
    parse_date_time(
      gsub(".*(\\d{4}-\\d+-\\d+).*", "\\1", unlist(x)), 
      orders=c("Ymd", "Ydm"))))
[[1]]
       start
1 2023-09-12
2 2023-09-18
3 2023-09-18

[[2]]
       start
1 2023-09-16
2 2019-11-30
3 2019-11-30

请记住,像

2023-08-09
<>
2023-09-08
这样的矛盾日期是通过第一条规则
Ymd

来解释的
© www.soinside.com 2019 - 2024. All rights reserved.