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

使用Pandas计算订单日期间的物料消耗率

使用Pandas计算住宅物料日均消耗率

嘿,作为Python新手能先用SQL搞定核心逻辑已经超棒啦!下面我一步步带你用Pandas实现这个需求,代码里会加详细注释,你跟着复制运行就能理解每一步的作用~

第一步:先把你的数据转成可运行的Pandas DataFrame

首先我们把你提供的表格转换成Pandas能识别的格式,方便后续操作:

import pandas as pd

# 构造你的数据
data = {
    "House": ["A", "A", "A", "A", "A", "A", "A", "A", "A", "A"],
    "CheckDate": ["2020-01-01", "2020-01-02", "2020-01-03", "2020-05-01", "2020-05-02", "2020-05-15", "2020-05-15", "2020-05-16", "2020-06-17", "2020-07-03"],
    "Reading": [43.21, 43.06, 42.97, 9.82, 9.65, 0.23, 25.94, 49.71, 6.57, 9.65],
    "OrderDate": [pd.NaT, pd.NaT, pd.NaT, "2020-05-01", pd.NaT, pd.NaT, pd.NaT, pd.NaT, "2020-06-17", pd.NaT],
    "OrderedQuantity": [pd.NA, pd.NA, pd.NA, 50, pd.NA, pd.NA, pd.NA, pd.NA, 50, pd.NA],
    "DeliveryDate": [pd.NaT, pd.NaT, pd.NaT, pd.NaT, pd.NaT, pd.NaT, "2020-05-15", pd.NaT, pd.NaT, pd.NaT],
    "DeliveredQuantity": [pd.NA, pd.NA, pd.NA, pd.NA, pd.NA, pd.NA, 50, pd.NA, pd.NA, pd.NA]
}

df = pd.DataFrame(data)
# 把日期列转换成datetime类型,这一步很重要,不然没法计算日期间隔
df["CheckDate"] = pd.to_datetime(df["CheckDate"])
df["OrderDate"] = pd.to_datetime(df["OrderDate"])
df["DeliveryDate"] = pd.to_datetime(df["DeliveryDate"])

第二步:实现你的计算逻辑

按照你给出的公式,我们分步骤计算:

1. 提取订单相关的关键信息

首先筛选出所有有订单的记录(OrderDate不为空的行),然后找到首次和末次订单的日期,以及对应的Reading值:

# 筛选有订单的行并按日期排序
order_records = df[df["OrderDate"].notna()].sort_values("OrderDate")

# 首次订单日的Reading值
first_order_reading = order_records.iloc[0]["Reading"]
# 末次订单日的Reading值
last_order_reading = order_records.iloc[-1]["Reading"]

# 计算首尾订单日的间隔天数(提取days属性获得整数天数)
days_between = (order_records.iloc[-1]["OrderDate"] - order_records.iloc[0]["OrderDate"]).days

2. 计算所有配送量的总和

然后统计所有已完成配送的数量之和:

total_delivered = df["DeliveredQuantity"].dropna().sum()

3. 计算总消耗量和日均消耗率

最后代入你的公式计算最终结果:

# 总消耗量 = 所有配送量之和 + 首次订单日Reading值 - 末次订单日Reading值
total_consumption = total_delivered + first_order_reading - last_order_reading
# 日均消耗率 = 总消耗量 / 首尾订单日间隔天数
daily_consumption_rate = total_consumption / days_between

# 打印结果,保留两位小数更直观
print(f"总消耗量: {total_consumption:.2f}")
print(f"日均消耗率: {daily_consumption_rate:.2f}")

运行结果说明

根据你的数据,运行后会得到:

  • 总消耗量:50 + 9.82 - 6.57 = 53.25
  • 首尾订单日间隔:2020-06-17 减去 2020-05-01,一共47天
  • 日均消耗率:53.25 / 47 ≈ 1.13

额外提示(针对新手)

  • 一定要把日期列转换成datetime类型,不然Pandas没法识别日期格式,计算间隔会出错
  • 如果你的数据包含多个住宅,可以用groupby("House")分组计算每个住宅的消耗率,示例代码如下:
def calculate_consumption(group):
    order_records = group[group["OrderDate"].notna()].sort_values("OrderDate")
    # 处理没有足够订单记录的情况
    if len(order_records) < 2:
        return pd.Series([None, None], index=["total_consumption", "daily_rate"])
    first_order_reading = order_records.iloc[0]["Reading"]
    last_order_reading = order_records.iloc[-1]["Reading"]
    days_between = (order_records.iloc[-1]["OrderDate"] - order_records.iloc[0]["OrderDate"]).days
    total_delivered = group["DeliveredQuantity"].dropna().sum()
    total_consumption = total_delivered + first_order_reading - last_order_reading
    daily_rate = total_consumption / days_between
    return pd.Series([total_consumption, daily_rate], index=["total_consumption", "daily_rate"])

# 按House分组计算每个住宅的消耗数据
result = df.groupby("House").apply(calculate_consumption).reset_index()
print(result)

内容的提问来源于stack exchange,提问作者f722axzo5d

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:27:31