You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何组合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)

代码说明

  1. 区间转换:通过piso.interval_from_cols将每行的From_Mi和To_Mi转换为区间对象,简化后续的包含关系判断。
  2. 生成子路段:提取所有原始记录中的里程端点,去重排序后生成连续的最小不重叠子路段,这些子路段就是我们需要单独分析的单元。
  3. 匹配最新日期:对每个子路段,使用piso.contains找到所有覆盖它的检查记录,取这些记录中的最大日期即为该路段的最新检查日期。
  4. 格式化输出:将结果整理成目标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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:52:47