如何基于日期列年月值过滤数据及解决month()函数'int对象不可调用'报错
报错原因
- 核心触发原因:你在代码中把
month作为变量名赋值为整数,覆盖了PySpark内置的month日期处理函数,后续你尝试调用month()时,Python将其识别为整数变量而非函数,因此抛出"int object is not callable"报错。 - 额外问题:你当前的日期转换代码本身存在多处错误,会导致后续日期处理失效:
- 日期格式符书写错误:日期格式中大写
M代表月份,小写m代表分钟,你写的Mm/dd/yyyy为无效格式,会生成空值 - 语法错误:
unix_timestamp方法缺少闭合的右括号 - 列名可能存在笔误:你转换时传入的字符串列名为
ifrs_year_dr,如果实际列名是ifrs_year_dt会直接报错
- 日期格式符书写错误:日期格式中大写
解决方案
- 首先解决命名冲突问题,优先使用带前缀的函数调用方式避免覆盖,这也是PySpark开发的最佳实践:
# 导入函数库时统一加别名F import pyspark.sql.functions as F # 所有内置函数都通过F前缀调用,完全避免命名冲突 df = df.withColumn('month', F.month(df['ifrs_year_dt'])) df = df.filter(F.month(df['ifrs_year_dt']) == 3)
如果你已经赋值过month变量,可以执行del month删除该变量,或直接重启当前PySpark会话恢复month函数的默认引用。
2. 修复日期转换的错误代码,正确写法如下:
# 若你的原始字符串日期列名是ifrs_year_dt请自行替换 df = df.withColumn('ifrs_year_dt', F.to_date(F.unix_timestamp('ifrs_year_dr', 'MM/dd/yyyy').cast('timestamp')))
内容的提问来源于stack exchange,提问作者Anuj Chaudhary
相关产品推荐
相关产品推荐

