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

Pandas中如何基于索引值计算DataFrame列值?

基于时间索引与用电量计算电价费用的Pandas最佳方案

你需要根据时间索引匹配电价规则,结合用电量计算最终费用,以下是几种更高效、易维护的推荐方案,同时说明现有方案的问题:

现有方案的问题

  • iterrows逐行遍历性能极差,Pandas的设计初衷是向量化操作,大数据量下这种方法会拖慢运行速度;
  • 第二种方案中time变量未定义,会触发NameError,且规则增多时需要重复编写大量df.loc语句,扩展性差。

方案1:修正版apply(灵活适配复杂规则)

如果需要保留自定义逻辑的灵活性,可以用apply实现,核心是通过row.name获取索引值:

def calc_cost(row):
    row_time = row.name.time()
    consumption = row['kWh']
    # 遍历电价规则,避免硬编码elif
    for rule in tariff[:-1]:
        if row_time == rule['time']:
            return consumption * rule['cost']
    # 匹配默认电价
    return consumption * tariff[-1]['cost']

# axis=1表示按行应用函数
df['tariff_apply'] = df.apply(calc_cost, axis=1)

方案2:向量化映射(性能最优,推荐)

利用Pandas的向量化特性,完全避免Python层面的循环,处理大数据时速度提升显著:

# 提取索引中的时间部分
df['time_of_day'] = df.index.time

# 构建电价映射字典(排除默认规则)
tariff_map = {rule['time']: rule['cost'] for rule in tariff if rule['time'] != 'default'}
default_cost = tariff[-1]['cost']

# 匹配电价并计算费用
df['tariff_vectorized'] = df['time_of_day'].map(tariff_map).fillna(default_cost) * df['kWh']

方案3:时间区间匹配(适配实际需求的范围判断)

如果实际场景需要匹配时间区间而非单个时间点,用pd.cut实现向量化区间判断:

# 先定义时间区间形式的电价规则(示例)
tariff_ranges = [
    {'start': dt.time(0,0), 'end': dt.time(1,0), 'cost':1.0},
    {'start': dt.time(1,0), 'end': dt.time(2,0), 'cost':3.0},
    {'default': 2.0}
]

# 辅助函数:将时间转换为分钟数,方便区间比较
def time_to_minutes(t):
    return t.hour * 60 + t.minute

df['time_min'] = df.index.time.map(time_to_minutes)

# 构建区间边界与对应费用
bins = [0]
cost_labels = []
for rule in tariff_ranges[:-1]:
    bins.append(time_to_minutes(rule['end']))
    cost_labels.append(rule['cost'])
bins.append(24*60)  # 一天的总分钟数

# 匹配区间并计算费用
df['tariff_range'] = pd.cut(
    df['time_min'],
    bins=bins,
    labels=cost_labels,
    include_lowest=True
).fillna(tariff_ranges[-1]['default']) * df['kWh']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 16:33:31