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

Pandas忽略年份映射Series到DataFrame的非apply实现方法

无.apply的简洁Pandas实现方案

有,直接基于Pandas向量化操作就能实现,不需要逐行调用.apply,性能比apply高一个量级,核心思路是剥离两边时间的年份维度,只用月、日、时分信息做键匹配即可。

实现代码

假设你的34年数据DataFrame为df,时间信息存放在DatetimeIndex索引上;单年参考数据为ref_s,时间同样存放在自身的DatetimeIndex上:

# 可选:如果时间带秒级偏移,先统一规整到小时粒度,避免匹配漏数
df.index = df.index.floor("H")
ref_s.index = ref_s.index.floor("H")

# 把参考Series的索引替换为「月-日 时:分」格式的无年份键,生成映射表
ref_map = ref_s.set_axis(ref_s.index.strftime("%m-%d %H:%M"))

# 目标DF提取同样格式的键,直接映射赋值新列
df["new_col"] = df.index.strftime("%m-%d %H:%M").map(ref_map)

如果你的时间信息不是存在索引上,而是存在df的某一列(比如列名是dt),把上面代码里的df.index替换为df["dt"].dt即可,参考代码:

df["new_col"] = df["dt"].dt.strftime("%m-%d %H:%M").map(ref_map)

可选替代写法

如果不想用字符串做匹配键,也可以提取时间的月、日、时、分属性做多级索引匹配,逻辑完全等价,性能没有差异:

ref_map = ref_s.set_axis([ref_s.index.month, ref_s.index.day, ref_s.index.hour, ref_s.index.minute])
df["new_col"] = pd.MultiIndex.from_arrays([
    df.index.month, df.index.day, df.index.hour, df.index.minute
]).map(ref_map)

以上写法全是Pandas原生向量化逻辑,没有逐行遍历的开销,哪怕是34年逐小时粒度的30万行左右数据,跑起来也是毫秒级出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:30:52