如何为DataFrame中每个起始日期匹配下一个日期生成结束日期表
问题:基于起始日期生成结束日期DataFrame
我有一个包含100列日期数据的DataFrame,需要为每行中的每个日期值匹配该行内下一个更大的日期作为对应位置的结束日期,生成新的结束日期DataFrame;如果该行中没有比当前日期更大的日期,则为该日期增加一天。
起始日期示例
| gas station | park | beach | store | Car A | 1/1/2022 | 1/4/2021 | 1/2/2021 | 1/3/2021 | Car B | 2/14/2021 | 2/10/2021| 2/21/2021| 2/5/2021
预期结束日期示例
| gas station | park | beach | store | Car A | 1/2/2022 | 1/5/2021 | 1/3/2021 | 1/4/2021 | Car B | 2/21/2021 | 2/14/2021| 2/22/2021| 2/10/2021
规则说明
- 每行对应一辆车,每列对应一个地点,单元格值为车辆抵达该地点的日期;
- 对每个单元格日期,在当前行所有日期中找比它大的最小日期作为结束日期;
- 若当前行无更大日期,则将该日期加1天。
解决方案(Python Pandas)
1. 准备数据并转换日期类型
首先要确保所有日期列是datetime类型,这样才能正确进行比较和运算:
import pandas as pd from datetime import timedelta # 构建示例DataFrame data = { 'gas station': ['1/1/2022', '2/14/2021'], 'park': ['1/4/2021', '2/10/2021'], 'beach': ['1/2/2021', '2/21/2021'], 'store': ['1/3/2021', '2/5/2021'] } df_start = pd.DataFrame(data, index=['Car A', 'Car B']) # 转换所有列为datetime类型 df_start = df_start.apply(pd.to_datetime)
2. 定义逐行处理函数
编写函数处理每行的日期,找到每个日期对应的下一个更大值,无更大值则加1天:
def process_row_dates(row): # 对当前行的日期去重并排序 sorted_unique_dates = sorted(row.unique()) stop_dates = [] for current_date in row: # 筛选出比当前日期大的所有日期 larger_dates = [d for d in sorted_unique_dates if d > current_date] if larger_dates: # 取最小的那个作为结束日期 stop_date = min(larger_dates) else: # 无更大日期则加1天 stop_date = current_date + timedelta(days=1) stop_dates.append(stop_date) return pd.Series(stop_dates, index=row.index)
3. 生成结束日期DataFrame
应用函数到每行,并可按需转换为指定日期格式:
# 生成结束日期DataFrame df_stop = df_start.apply(process_row_dates, axis=1) # 转换为示例中的日期格式(可选) df_stop = df_stop.apply(lambda col: col.dt.strftime('%m/%d/%Y')) # 打印结果 print(df_stop)
输出结果
gas station park beach store Car A 01/02/2022 01/05/2021 01/03/2021 01/04/2021 Car B 02/21/2021 02/14/2021 02/22/2021 02/10/2021
关键说明
- 日期类型转换是核心前提,避免字符串比较带来的错误;
- 对每行日期去重排序后,能高效定位到下一个更大的日期;
- 该方法适配100列的大数据量,逐行处理逻辑清晰且性能稳定。
内容的提问来源于stack exchange,提问作者Plentyoftime
相关产品推荐
相关产品推荐

