Python Pandas按月份筛选多列日期并生成对应列的技术求助
解决多列日期按月份归类到新列的问题
我来帮你搞定这个多列日期分类的需求!你之前的代码只能处理单列,还碰到了日期格式错乱的问题,咱们一步步来解决:
第一步:统一日期格式(解决格式错乱问题)
首先得把所有日期列转换成标准的datetime格式,这样才能准确识别月份。用pandas的to_datetime方法,还能自动处理格式不统一的情况,把无效的日期转成NaT(空日期值):
import pandas as pd # 读取你的输入文件(根据实际文件格式调整,比如Excel就用read_excel) sf = pd.read_csv('your_input_file.csv') # 筛选所有日期列:如果你的日期列是特定范围(比如第2到31列),可以改成sf.columns[1:31] date_cols = sf.columns # 遍历每一列,转换为标准datetime格式 for col in date_cols: sf[col] = pd.to_datetime(sf[col], errors='coerce')
第二步:创建目标新列并填充对应月份日期
接下来我们创建May和June两个新列,然后遍历所有日期列,把对应月份的日期填充进去。这里分两种场景:
场景1:每行只保留一个5月/6月日期(优先取第一个遇到的)
如果你的数据每行最多只有一个5月日期和一个6月日期,用这种方式更高效:
# 初始化新列为空日期值 sf['May'] = pd.NaT sf['June'] = pd.NaT # 遍历所有日期列,填充对应月份的日期 for col in date_cols: # 填充5月日期:只填充May列还为空的行 sf.loc[(sf[col].dt.month == 5) & sf['May'].isna(), 'May'] = sf[col] # 填充6月日期:只填充June列还为空的行 sf.loc[(sf[col].dt.month == 6) & sf['June'].isna(), 'June'] = sf[col]
场景2:收集每行所有5月/6月日期(用逗号分隔)
如果一行里有多个5月或6月日期,想要全部收集起来,用apply逐行处理:
# 收集所有5月日期,转成字符串用逗号分隔 sf['May'] = sf[date_cols].apply( lambda row: ', '.join(row[row.dt.month == 5].dt.strftime('%Y-%m-%d')), axis=1 ) # 收集所有6月日期 sf['June'] = sf[date_cols].apply( lambda row: ', '.join(row[row.dt.month == 6].dt.strftime('%Y-%m-%d')), axis=1 ) # 把空字符串转为空值(可选) sf['May'] = sf['May'].replace('', pd.NA) sf['June'] = sf['June'].replace('', pd.NA)
第三步:格式化日期显示(可选)
如果需要把日期显示成特定格式(比如YYYY-MM-DD),可以用dt.strftime:
# 仅当场景1时可用(场景2已经是字符串了) sf['May'] = sf['May'].dt.strftime('%Y-%m-%d') sf['June'] = sf['June'].dt.strftime('%Y-%m-%d')
第四步:保存结果
最后把处理好的数据保存成输出文件:
# 保存为csv,要是Excel就用to_excel sf.to_csv('your_output_file.csv', index=False)
关键改进点
- 不再局限于单列:遍历所有日期列,一次性处理30多列数据
- 解决格式错乱:先统一转换为
datetime格式,避免因格式不统一导致的筛选错误 - 灵活适配需求:两种场景覆盖不同的业务需求
内容的提问来源于stack exchange,提问作者Pigel J
相关产品推荐
相关产品推荐

