Pandas append添加date_range序列后DataFrame为空报NDFrame.head错误
问题原因
- pandas的
append方法不会原地修改原有对象,只会返回新的拼接结果,你的代码没有将df['Date'].append(per2)的返回值赋值回原DataFrame的对应列,因此原有空df不会产生任何变化。 - 初始0行的空DataFrame无需通过append方式填充数据,直接给对应列赋值长度匹配的日期序列的写法效率更高,也不需要额外将
date_range转为Series。
可直接运行的修正代码
import pandas as pd def date_calendar(startdate, enddate, datefreq): # 先生成所需的日期序列,直接作为Date列初始化DataFrame date_series = pd.date_range(start=startdate, end=enddate, freq=datefreq) df = pd.DataFrame({ 'Date': date_series }) # 基于Date列生成其他衍生字段,也可根据业务需求自行调整计算规则 df['Year'] = df['Date'].dt.year df['FY Year'] = '' # 可替换为你的财年计算逻辑 df['Quarter'] = df['Date'].dt.quarter df['MonthNum'] = df['Date'].dt.month df['YearMonth'] = df['Date'].dt.strftime('%Y年%m月') df['YearMonthShort'] = df['Date'].dt.strftime('%y%m') df['YearMonthNum'] = df['Date'].dt.strftime('%Y%m').astype(int) return df # 调用示例:原代码中的table参数未使用,已移除 calendar_df = date_calendar(startdate='1-1-2019', enddate='6-30-2024', datefreq='D') print(calendar_df.head())
补充说明
如果确实需要沿用先建空df再append的逻辑,需要将append的结果赋值回对应列,同时指定ignore_index=True避免索引冲突,示例如下:
# 仅作append用法演示,实际场景不推荐该写法 df['Date'] = df['Date'].append(per2, ignore_index=True)
内容的提问来源于stack exchange,提问作者Gunter Herd
相关产品推荐
相关产品推荐

