在R的lubridate中转换日期格式,如何将年份设为19xx而非20xx
解决lubridate解析两位年份为20xx的问题
这个问题我之前处理类似数据集时也碰到过!lubridate其实自带了专门解决两位年份解析偏差的参数,完全不用手动去给字符串加'19',给你两种简单靠谱的方法:
方法1:用parse_date_time()精准控制截断年份
首先得把因子格式的dob列转成字符型(lubridate处理字符型日期更顺畅),然后用parse_date_time()函数,通过cutoff_year参数明确告诉它:两位年份大于等于某个值时,解析为19xx;小于则解析为20xx。
比如你的数据里4/11/64要对应1964,只要设置cutoff_year=64,这样所有两位年份≥64的都会被解析为19xx,<64的则对应20xx(如果你的数据里有00-63的年份属于20xx的话)。代码示例:
library(lubridate) # 将因子列转为字符型 Marriage$dob_char <- as.character(Marriage$dob) # 解析日期:指定格式为月/日/年,设置截断年份 Marriage$dob_date <- parse_date_time(Marriage$dob_char, orders = "mdy", cutoff_year = 64)
如果你的数据里所有两位年份都是19xx,直接把cutoff_year设为100就行,这样所有两位年份都会被解析成19xx。
方法2:用mdy()快捷函数配合cutoff_2000参数
lubridate的快捷日期函数(比如对应月/日/年格式的mdy())也支持年份截断设置,cutoff_2000参数的逻辑是:两位年份≤该值时解析为20xx,>该值时解析为19xx。
要把64解析成1964,只要把cutoff_2000设为63,这样64>63就会自动对应1964,代码更简洁:
library(lubridate) # 直接转换,无需先转字符(lubridate会自动处理因子) Marriage$dob_date <- mdy(Marriage$dob, cutoff_2000 = 63)
补充:为什么之前的方法出问题?
默认情况下,as_date()或strptime()的年份截断规则是基于当前年份计算的(比如R默认用当前年份减69作为截断点),如果你的两位年份刚好落在默认规则的20xx区间里,就会出现解析错误。而上面两种lubridate的方法可以让你精准控制年份映射,完全避免这种问题。
内容的提问来源于stack exchange,提问作者wawalmx
相关产品推荐
相关产品推荐

