批量转换数据框列表日期列类型(lubridate)及报错排查
解决日期列转换的错误问题
看起来你在处理列表里的dataframe日期转换时踩了两个小坑,我来帮你理清问题并给出解决方案:
错误原因分析
你当前的代码报错主要有两个原因:
- 你用了
strftime(x, format="%d-%b-y"),但这里的x是整个dataframe,而strftime是用来格式化已有的日期/时间对象的,不是用来解析字符型字符串的,R自然不知道怎么把整个dataframe转成POSIXlt类型,所以抛出了那个错误。 - 你的匿名函数只修改了dataframe的第5列,但没有返回修改后的完整dataframe,最终
lapply得到的结果会是不完整的(甚至是一堆NULL),这也不符合你的需求。
用lubridate的正确解法
既然你想用lubridate,那它的dmy()函数正好匹配你的dd-mmm-yy格式(日-月份缩写-两位年份),直接用它来解析字符型日期就好。记得在函数里返回完整的dataframe:
首先确保加载lubridate包:
library(lubridate)
然后修改你的lapply代码:
firstOfMonth <- lapply(fileList, function(x) { # 把第5列的字符型日期转成Date类型 x[, 5] <- dmy(x[, 5]) # 必须返回修改后的整个dataframe,不然lapply只保留修改的列 return(x) })
额外优化建议
- 如果你的第5列有固定列名,建议用列名代替索引(比如
x$transaction_date),这样代码更清晰,也不会因为列顺序变动出错。 - 如果存在格式不规范的日期字符串,
dmy()会抛出警告并返回NA,你可以用dmy(x[,5], quiet = TRUE)来抑制警告,之后用is.na()检查哪些日期解析失败了。 - 如果你不想用lubridate,用base R的
as.Date()也能解决,注意格式字符串要写对(是%d-%b-%y,小写%y代表两位年份):
firstOfMonth <- lapply(fileList, function(x) { x[, 5] <- as.Date(x[, 5], format = "%d-%b-%y") return(x) })
内容的提问来源于stack exchange,提问作者regents
相关产品推荐
相关产品推荐

