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
相关产品推荐
相关产品推荐

