基于指定日期范围的可扩展多列日期筛选与结构化输出需求
可扩展的多列日期筛选方案
这问题我熟!要实现这种可扩展的多列日期筛选,最稳妥的方式是先把宽表转成窄表(也就是unpivot操作)——这种方式天然支持后续新增任意多列,核心逻辑完全不用改动。下面用Python的pandas给你提供一个可复用的实现方案:
核心思路
- 将多列日期数据(Box 1、Box 2...)转换为「Name-Item-日期」的单行记录格式(宽表转窄表)
- 统一解析日期格式,筛选出落在指定范围内的记录
- 整理成期望的结构化输出
代码实现
import pandas as pd # 1. 准备示例输入数据 data = { "Name": ["Bill", "Bob", "Jeff", "Sam"], "Box 1": ["1-Sep-21", "30-Aug-21", "31-Aug-21", "31-Aug-21"], "Box 2": ["3-Sep-21", "3-Sep-21", "4-Sep-21", "29-Aug-21"] } df = pd.DataFrame(data) # 2. 宽表转窄表(unpivot)——这里的关键是支持扩展列 # 用df.columns[1:]自动获取所有非Name列,新增Box3/Box4时无需修改代码 melted_df = df.melt( id_vars="Name", value_vars=df.columns[1:], var_name="Item", value_name="Sold Date" ) # 3. 解析日期并筛选指定范围(2021-09-01至2021-09-07) melted_df["Sold Date"] = pd.to_datetime(melted_df["Sold Date"], format="%d-%b-%y") start_date = pd.to_datetime("2021-09-01") end_date = pd.to_datetime("2021-09-07") filtered_df = melted_df[ melted_df["Sold Date"].between(start_date, end_date) ].sort_values(by="Name") # 4. 转换回原日期格式并输出 filtered_df["Sold Date"] = filtered_df["Sold Date"].dt.strftime("%d-%b-%y") print(filtered_df.reset_index(drop=True))
运行结果
Name Item Sold Date 0 Bill Box 1 01-Sep-21 1 Bill Box 2 03-Sep-21 2 Bob Box 2 03-Sep-21 3 Jeff Box 2 04-Sep-21
扩展性说明
- 如果后续新增
Box 3、Box 4等列,只需要确保输入数据包含这些列,代码中的df.columns[1:]会自动识别所有非Name列,无需修改任何逻辑 - 日期范围可以通过修改
start_date和end_date变量轻松调整,支持任意时间段筛选
内容的提问来源于stack exchange,提问作者Dakota Brunson
相关产品推荐
相关产品推荐

