如何组合piso函数生成资产路段最新检查日期数据框?
解决方案:提取道路各子路段的最新检查日期
核心思路
我们需要将原始的重叠检查路段拆分为最小的不重叠子路段,然后为每个子路段找到所有覆盖它的检查记录中的最新日期。使用piso库可以高效处理区间包含、端点提取这类操作,无需手动调用split()或intersection()。
完整代码实现
import pandas as pd import piso # 原始检查记录数据 all_df = pd.DataFrame( data=( (0, 5, pd.Timestamp("2025-1-1")), (2, 5, pd.Timestamp("2025-1-8")), (0, 3, pd.Timestamp("2025-1-15")), (0, 2, pd.Timestamp("2025-1-22")), ), columns=["From_Mi", "To_Mi", "Date"] ) # 1. 将里程范围转换为piso区间对象 all_df["interval"] = piso.interval_from_cols(all_df, "From_Mi", "To_Mi") # 2. 提取所有唯一里程端点,生成最小不重叠子路段 all_endpoints = sorted(set(all_df["From_Mi"].tolist() + all_df["To_Mi"].tolist())) sub_intervals = [piso.closed(left, right) for left, right in zip(all_endpoints[:-1], all_endpoints[1:])] # 3. 为每个子路段匹配最新检查日期 results = [] for sub_int in sub_intervals: # 筛选出覆盖当前子路段的所有检查记录 coverage_mask = piso.contains(all_df["interval"], sub_int) latest_check_date = all_df.loc[coverage_mask, "Date"].max() # 提取子路段的起止里程 results.append({ "From_Mi": sub_int.left, "To_Mi": sub_int.right, "Last Date": latest_check_date }) # 4. 转换为目标格式的DataFrame,并格式化日期显示 recent_df = pd.DataFrame(results) recent_df["Last Date"] = recent_df["Last Date"].dt.strftime("%m/%d/%Y") print(recent_df)
代码说明
- 区间转换:通过
piso.interval_from_cols将每行的From_Mi和To_Mi转换为区间对象,简化后续的包含关系判断。 - 生成子路段:提取所有原始记录中的里程端点,去重排序后生成连续的最小不重叠子路段,这些子路段就是我们需要单独分析的单元。
- 匹配最新日期:对每个子路段,使用
piso.contains找到所有覆盖它的检查记录,取这些记录中的最大日期即为该路段的最新检查日期。 - 格式化输出:将结果整理成目标DataFrame,并将日期格式化为用户指定的
mm/dd/yyyy样式。
替代方案(不使用piso)
如果不想依赖piso,可以手动实现区间包含判断:
# 生成子路段的步骤同上 results = [] for left, right in zip(all_endpoints[:-1], all_endpoints[1:]): # 手动判断原始记录是否覆盖当前子路段 mask = (all_df["From_Mi"] <= left) & (all_df["To_Mi"] >= right) latest_date = all_df.loc[mask, "Date"].max() results.append({"From_Mi": left, "To_Mi": right, "Last Date": latest_date}) recent_df = pd.DataFrame(results) recent_df["Last Date"] = recent_df["Last Date"].dt.strftime("%m/%d/%Y")
内容的提问来源于stack exchange,提问作者chroberts
相关产品推荐
相关产品推荐

