使用lubridate的guess_formats转换日期时出现重复值问题求助
问题原因
你遇到的重复值问题,根源在于guess_formats()返回了多个候选日期格式,而as.Date()在接收多个格式参数时,会对每个格式都尝试转换所有输入元素,最后把所有成功转换的结果拼接在一起,自然就出现了重复值。
你可以先验证一下guess_formats()的输出:
guess_formats(x, "Ymd HMS") # 输出会是两个格式:"%Y-%m-%d %H:%M:%S" 和 "%Y-%m-%d"
解决方法
这里有几个简单且实用的解决方案:
1. 只使用guess_formats()返回的第一个(最匹配的)格式
既然第一个格式完全匹配你的输入字符串,直接取第一个元素即可:
library(lubridate) x <- c("2014-01-18 00:00:00","2015-03-01 00:00:00","2014-05-05 00:00:00") # 提取第一个匹配的格式 target_format <- guess_formats(x, "Ymd HMS")[1] y <- as.Date(x, format = target_format) # 查看结果 y # [1] "2014-01-18" "2015-03-01" "2014-05-05"
2. 直接使用lubridate的专用解析函数
你的日期格式是标准的年-月-日 时:分:秒,可以直接用ymd_hms()函数解析,它会自动处理时间部分,若只需要日期类型,再用as.Date()转换即可:
library(lubridate) x <- c("2014-01-18 00:00:00","2015-03-01 00:00:00","2014-05-05 00:00:00") y <- as.Date(ymd_hms(x)) # 查看结果 y # [1] "2014-01-18" "2015-03-01" "2014-05-05"
3. 使用parse_date_time()自动匹配多格式
如果你的数据集里存在多种日期格式,parse_date_time()可以自动尝试指定的格式规则,返回正确结果且不会产生重复:
library(lubridate) x <- c("2014-01-18 00:00:00","2015-03-01 00:00:00","2014-05-05 00:00:00") y <- as.Date(parse_date_time(x, orders = "Ymd HMS")) # 查看结果 y # [1] "2014-01-18" "2015-03-01" "2014-05-05"
内容的提问来源于stack exchange,提问作者Marianne
相关产品推荐
相关产品推荐

