Pandas处理datetime64[ns]日期:保留年月移除日时报错排查与解决
解决Pandas日期列仅保留年月的错误问题
嘿,我来帮你搞定这个问题!首先咱们先搞清楚你遇到的错误原因:
你调用pd.to_datetime(df['my_date'].dt.year, df['my_date'].dt.month, 0)的方式不对——pd.to_datetime的参数规则不是这样的。这个函数的第一个参数是需要转换的目标数据(比如Series、字符串数组等),而你直接把三个独立的Series(年、月、固定的0)作为位置参数传进去,函数内部无法正确解析这些参数的类型,所以抛出了TypeError: invalid type comparison。
接下来给你几种简单靠谱的修复方法,按需选择:
方法1:直接转成月份周期(最简洁)
如果你只需要保留「年-月」的标识,不需要严格的datetime类型,用dt.to_period('M')是最方便的:
# 确保原日期列已经是datetime类型(如果不是先执行下面这行) # df['my_date'] = pd.to_datetime(df['my_date']) df['my_date_new'] = df['my_date'].dt.to_period('M')
这样得到的结果是类似2023-10的周期类型,后续做分组、统计都很方便。如果需要转成当月第一天的datetime类型,再加一步:
df['my_date_new'] = df['my_date'].dt.to_period('M').dt.to_timestamp()
方法2:格式化字符串后转datetime
先把原日期格式化为YYYY-MM的字符串,再转成datetime(结果会默认是当月第一天):
df['my_date_new'] = pd.to_datetime(df['my_date'].dt.strftime('%Y-%m'))
方法3:构造参数传入pd.to_datetime(灵活可控)
如果你想明确指定年、月、日(比如固定为1号),可以构造一个包含年、月、日的字典传给pd.to_datetime:
df['my_date_new'] = pd.to_datetime({ 'year': df['my_date'].dt.year, 'month': df['my_date'].dt.month, 'day': 1 })
这种方式可以自定义日的数值,灵活性更高。
内容的提问来源于stack exchange,提问作者Edamame
相关产品推荐
相关产品推荐

