我只是引用了lubridate::parse_date_time()
的help page,特别是它的select_format
参数。但是我无法获得它并为我自己的用例设计我自己的函数。
实际上,我有几种格式的未清理日期向量。为了简单起见,让我们假设,我有mdy
,dmy
,ymd
和ydm
的日期。
my_dates <- c("1988-02-03", "1988-15-03", "05-12-2023", "5-27-2022")
lubridate::parse_date_time(my_dates, orders = c("dmy","mdy", "ymd", 'ydm'))
#> [1] "1988-03-02 UTC" "1988-03-15 UTC" "2023-05-12 UTC" "2022-05-27 UTC"
字符串
在输出中,我希望dmy
优先于mdy
,ymd
优先于ydm
。我怎么做?我的输出应该是-
#> [1] "1988-02-03 UTC" "1988-03-15 UTC" "2023-12-05 UTC" "2022-05-27 UTC"
型
1条答案
按热度按时间twh00eeo1#
默认情况下,
parse_date_time()
基于提供的orders
生成一组strptime()
日期格式(例如%Y-%m-%d
),针对日期的子集训练这些格式,并且根据与训练数据的匹配数量对这些格式进行排名,并基于格式中的标记数量和某些标记的存在应用权重。要按顺序使用从
orders
猜测的格式,可以设置train = FALSE
。字符串
如果您想按预期使用
select_format
参数,那么逐步了解发生了什么可能会很有用。一个函数,用于从一组与x的训练子集匹配的格式中选择实际格式进行解析。它接收一个命名的整数向量并返回所选格式的字符向量。输入向量的名称是与训练集匹配的格式(而不是顺序)。
我们可以看到通过调用
guess_formats()
猜测的格式:型
由于相同的格式可以被猜测多次,因此只需要唯一的格式:
型
这些都是针对训练集进行测试的,以查看每个格式返回多少有效转换:
型
默认情况下,这个命名的vector然后被传递给
.select_formats
函数,该函数对格式进行加权和排序。您可以检查未导出的函数,以查看应用于某些token的默认权重:型
调用
parse_date_time(my_dates, my_orders)
时格式的默认优先级为:型
为了改变这一点,我们可以提供一个自定义函数来应用不同的权重,即优先考虑以
%d-%m
开头的格式,而不是%m-%d
和%Y-%m
开头的格式,而不是%Y-%d
。型
利用这一点,现在的优先事项是:
如果我们在
parse_date_time()
中使用它,我们会得到你想要的结果:值得注意的是,另一种替代方法是使用
parse_date_time2
并将strptime
直接传递给orders
: