如何用Pandas的.offsets()/Dateoffset()修改DataFrame日期列频率?
解决方案
我们可以利用pandas.tseries.offsets.BusinessDay(DateOffset的子类)生成1工作日频率的日期序列,再结合原数据填充对应列的值,最终得到7条记录的DataFrame。
步骤1:导入依赖并查看原数据
import pandas as pd import numpy as np from pandas.tseries.offsets import BusinessDay # 原DataFrame df = pd.DataFrame( { 'A': np.random.randint(0, 20, size = 3), 'B': pd.date_range('1/1/2010', periods = 3, freq = '3B') } ) df['A'] = df['A'].astype('Int64')
原数据的B列日期为:2010-01-01、2010-01-06、2010-01-11,间隔3个工作日。
步骤2:生成1工作日频率的目标日期序列
以原数据的首尾日期为范围,用BusinessDay(1)作为频率生成完整的工作日序列,正好包含7条记录:
# 获取首尾日期 start_date = df['B'].iloc[0] end_date = df['B'].iloc[-1] # 生成1工作日频率的日期序列 target_dates = pd.date_range(start=start_date, end=end_date, freq=BusinessDay(1))
步骤3:合并原数据并填充缺失值
将原数据按B列设为索引,重新索引到目标日期序列,再用向前填充(ffill)补全A列的缺失值:
# 重新索引并填充 result_df = df.set_index('B') \ .reindex(target_dates) \ .ffill() \ .reset_index() \ .rename(columns={'index': 'B'}) # 保持与原数据一致的Int64类型 result_df['A'] = result_df['A'].astype('Int64')
最终输出
result_df将包含7条记录,B列按1工作日频率排列,A列保留原数据的对应值并填充中间缺失项。
另一种直观实现方式
如果需要手动用DateOffset逐个生成日期,可以这样写:
# 从起始日期开始,逐个添加1个工作日,生成7条日期 dates = [start_date + BusinessDay(i) for i in range(7)] # 创建新DataFrame并匹配原数据的A值 new_df = pd.DataFrame({'B': dates}) new_df = pd.merge_asof(new_df, df, on='B', direction='backward')
merge_asof会自动将原数据的A值匹配到最近的前序日期,同样能得到符合要求的7条记录。
内容的提问来源于stack exchange,提问作者Mohamad Osama
相关产品推荐
相关产品推荐

