如何在Pandas DataFrame中按规则将日期转换为对应周一
Pandas DataFrame日期列头按自定义规则转换为对应周一日期
需求说明
需要将Pandas DataFrame的日期列头按照以下规则转换:
- 若日期为周一:保持原日期不变
- 若日期为周二、周三、周四:转换为当周周一
- 若日期为周五、周六、周日:转换为下周周一
转换后DataFrame的数据内容保持不变。
解决方案
我们可以通过将列头转换为datetime类型,利用星期几属性实现条件判断,最后将调整后的日期转回原格式字符串替换列头。
代码实现
首先导入依赖库:
import pandas as pd import numpy as np
创建示例DataFrame(匹配需求中的输入示例):
# 示例DataFrame,列头包含2022/4/18(周一)、2022/5/10(周二) df = pd.DataFrame( data=[[10, 20], [30, 40]], columns=['2022/4/18', '2022/5/10'] )
方法一:使用numpy.where实现向量式条件判断
# 将列名转换为datetime对象 cols = pd.to_datetime(df.columns) # 根据星期几计算需要调整的天数 adjustments = np.where( cols.weekday == 0, # 周一(weekday=0) pd.Timedelta(days=0), np.where( cols.weekday.isin([1, 2, 3]), # 周二到周四(weekday=1-3) -cols.weekday.apply(lambda x: pd.Timedelta(days=x)), pd.Timedelta(days=7) - cols.weekday.apply(lambda x: pd.Timedelta(days=x)) # 周五到周日(weekday=4-6) ) ) # 生成调整后的日期并转为原格式字符串 new_columns = cols + adjustments df.columns = new_columns.strftime('%Y/%m/%d')
方法二:使用自定义函数+map处理(更直观)
cols = pd.to_datetime(df.columns) def adjust_date_to_monday(date): weekday = date.weekday() if weekday == 0: return date elif 1 <= weekday <= 3: return date - pd.Timedelta(days=weekday) else: return date + pd.Timedelta(days=7 - weekday) new_columns = cols.map(adjust_date_to_monday) df.columns = new_columns.strftime('%Y/%m/%d')
验证结果
执行上述代码后,打印列头:
print(df.columns)
输出结果:
Index(['2022/4/18', '2022/5/09'], dtype='object')
符合需求:2022/5/10(周二)被转换为当周周一2022/5/09,2022/4/18(周一)保持不变,DataFrame的数据内容未改变。
关键逻辑说明
pd.to_datetime():将列头的日期字符串转换为datetime对象,便于获取星期几(weekday属性,周一为0,周日为6)- 调整规则:
- 周一:无需调整,直接返回原日期
- 周二-周四:减去当前星期几对应的天数(如周二减1天,周三减2天),回到当周周一
- 周五-周日:加上
7-当前星期几的天数(如周五加3天,周日加1天),跳转到下周周一
strftime('%Y/%m/%d'):将调整后的datetime对象转回与原格式一致的字符串,保证列头格式统一
内容的提问来源于stack exchange,提问作者Shan Jiang
相关产品推荐
相关产品推荐

