DataFrame月份列加指定月数后与当前日历月比较报错的解决方法
修正方案
核心问题
错误根源是日期类型不统一:scheduled_month是numpy.datetime64类型数组,而current_month是字符串转成的数组,二者无法直接比较;同时直接用numpy数组处理日期容易引发类型兼容问题。
修正后的代码(推荐用pandas原生日期工具)
import pandas as pd from io import StringIO from datetime import datetime csvfile = StringIO( """Name Year - Month Score Mike 2022-11 31 Mike 2022-09 136 """) df = pd.read_csv(csvfile, sep='\t', engine='python') d_name_plus_month = {"Mike":2} # 转换第一行日期为pandas Timestamp类型,保持日期类型统一 month_of_first_row = pd.to_datetime(df.iloc[0]['Year - Month']) plus_months = d_name_plus_month['Mike'] # 用DateOffset添加月份,自动处理跨年月的天数差异 scheduled_month = month_of_first_row + pd.DateOffset(months=plus_months) # 将当前日历月转为当月第一天的Timestamp current_month = pd.to_datetime(datetime.now().strftime("%Y-%m-01")) # 直接比较两个Timestamp对象 print(scheduled_month <= current_month)
关键修正点
- 统一日期类型:全程使用pandas的
Timestamp处理日期,避免混用numpy数组和字符串 - 正确添加月份:
pd.DateOffset(months=...)能自动适配不同月份的天数(比如1月加1个月自动转为2月,不受28/29天影响) - 标准化当前月份:转为当月第一天的Timestamp,确保和计算出的
scheduled_month格式一致,比较逻辑更准确
备选方案(兼容numpy写法)
如果坚持用numpy的datetime64类型,需将当前月份也转为同类型:
import pandas as pd from io import StringIO import numpy as np from datetime import datetime csvfile = StringIO( """Name Year - Month Score Mike 2022-11 31 Mike 2022-09 136 """) df = pd.read_csv(csvfile, sep='\t', engine='python') d_name_plus_month = {"Mike":2} month_of_first_row = pd.to_datetime(df.iloc[[0]]['Year - Month']).values.astype("datetime64[M]") plus_months = d_name_plus_month['Mike'] scheduled_month = month_of_first_row + np.timedelta64(plus_months, 'M') # 将当前月份转为datetime64[M]类型,与scheduled_month类型统一 current_month = np.datetime64(datetime.now().strftime("%Y-%m"), 'M') # 现在可直接比较 print(scheduled_month <= current_month)
内容的提问来源于stack exchange,提问作者Mark K
相关产品推荐
相关产品推荐

