将DataFrame多列从字符串转为日期时遇MethodError问题求助
问题:DataFrame日期列转换函数触发MethodError
我想定义一个函数,接收DataFrame(df::DataFrame)和要转成日期的列名向量(cols::Vector{Symbol}),当前代码如下:
function fixDateColumns(df::DataFrame, cols::Vector{Symbol}) function stringsToDates(dates::Vector) Date.(dates, dateformat"yyyy-mm-dd HH:MM:SS") end dates = stringsToDates(df[!, cols]) df[!, cols] = dates return df end
调用时:
fixDateColumns(df, [:Start_Date, :End_Date, :Recorded_Date])
出现错误:
ERROR: MethodError: no method matching (::var"#stringsToDates#11")(::DataFrame) Closest candidates are: (::var"#stringsToDates#11")(::Vector
请问哪里出错了?
解决方法
错误原因
你调用df[!, cols]时,因为cols是多列的Symbol向量,返回的是DataFrame类型的子集,但你的stringsToDates函数只接受Vector类型参数,类型不匹配就触发了MethodError。
修正方案
需要逐列处理日期转换,以下是两种简洁的实现方式:
方式1:循环遍历列处理
直接遍历每一列,对单列数据执行日期转换:
function fixDateColumns(df::DataFrame, cols::Vector{Symbol}) date_format = dateformat"yyyy-mm-dd HH:MM:SS" for col in cols df[!, col] = Date.(df[!, col], date_format) end return df end
方式2:用transform!批量处理
利用DataFrames.jl的transform!函数直接修改原DataFrame,结合广播语法批量处理目标列:
function fixDateColumns(df::DataFrame, cols::Vector{Symbol}) date_format = dateformat"yyyy-mm-dd HH:MM:SS" transform!(df, cols .=> x -> Date.(x, date_format); renamecols=false) return df end
两种方式都能正确处理多列的日期转换,解决原代码的类型不匹配问题。
内容的提问来源于stack exchange,提问作者psych0groov3
相关产品推荐
相关产品推荐

