如何扩展Pandas DataFrame使列起始为日历周周一?
高效扩展Pandas日期列至完整日历周起始的方法
现有一个以日期为列索引的Pandas DataFrame,其首个日期并非周一,需要前置若干列将起始日期调整为最近的周一,新增列的所有数据值设为0.0。示例初始化代码如下:
# Imports import numpy as np # version 1.20.3 import pandas as pd # version 1.3.4 # Dataframe initialization np.random.seed(0) col_idx = pd.date_range(start="2022-12-22", end="2023-01-15", freq="D") data = np.random.rand(5, len(col_idx)) df = pd.DataFrame(data, columns=col_idx)
高效实现方案
核心思路是批量生成需要新增的日期列,构造全0值的DataFrame后与原数据合并,避免逐列插入的低效操作:
# 获取原DataFrame的首个日期 first_date = df.columns[0] # 计算最近的周一:weekday()返回0=周一,通过时间差调整起始日期 days_to_monday = first_date.weekday() start_monday = first_date - pd.Timedelta(days=days_to_monday) # 生成需新增的日期范围(从周一到原首日期前一天) new_columns = pd.date_range(start=start_monday, end=first_date - pd.Timedelta(days=1), freq="D") # 构造全0的新增列DataFrame additional_df = pd.DataFrame(0.0, index=df.index, columns=new_columns) # 合并两个DataFrame,新增列置于左侧 df_extended = pd.concat([additional_df, df], axis=1)
关键说明
- 日期计算逻辑:通过
weekday()获取日期对应的星期序号(周一为0),用Timedelta计算出需要回溯的天数,得到最近的周一 - 批量操作:所有新增列通过
pd.date_range批量生成,合并操作使用pd.concat完成,全程无循环,保证处理大数据集时的效率 - 避免重复:新增日期范围的结束日期设为原首日期的前一天,确保不会和原数据的列索引重复
内容的提问来源于stack exchange,提问作者Xukrao
相关产品推荐
相关产品推荐

