You need to enable JavaScript to run this app. 如何优雅将pandas timedelta序列转换为「年+天」格式字符串?
优惠活动
大模型
产品
解决方案
定价
更多

如何优雅将pandas timedelta序列转换为「年+天」格式字符串?

pandas timedelta序列转格式化字符串的实现优化

你现在的写法可以大幅简化,完全不需要靠逐行apply、拼临时DataFrame来实现,以下是几个更高效、和你计算逻辑完全兼容的方案:

方案一:全向量化实现(性能最优,结果和原方案完全一致)

你原有的核心逻辑是按365天为1年拆分任期时长,这套计算可以完全靠pandas的向量化能力完成,没有任何逐行调用的损耗:

import pandas as pd

# 基础数据处理
df["End of Presidency"] = pd.to_datetime(df["End of Presidency"])
df["Start of Presidency"] = pd.to_datetime(df["Start of Presidency"])
df["Length of Presidency"] = df["End of Presidency"] - df["Start of Presidency"]

# 一步拆分整年数和剩余天数,divmod本身就支持Series输入
years, remain_days = divmod(df["Length of Presidency"].dt.days, 365)

# 直接拼接成目标格式的字符串,不需要循环、不需要逐行apply
df["Length of Presidency"] = years.astype(str) + " years, " + remain_days.astype(str) + " days"

这个写法相比你原来的代码:

  • 去掉了多余的concat临时表步骤
  • 干掉了性能很差的axis=1逐行apply,就算处理百万行级别的大表,计算也能在毫秒级完成
  • 代码量缩减60%左右,逻辑更直白不容易错

方案二:原生灵活格式化(适合标准时长展示)

如果你不需要硬按365天换算年粒度,pandas对timedelta序列原生支持类strftime的格式化能力,直接调用就能输出自定义格式:

# 比如输出为带天、小时维度的标准化时长
df["Duration Formatted"] = df["Length of Presidency"].dt.strftime("%D days, %H hours")

注意:timedelta的定义本身不包含固定长度的年、月维度(毕竟年、月的实际天数随日期、闰年变化),所以原生格式化不支持直接输出年粒度。如果业务上必须展示年数,还是要按你自己定义的换算规则拆分计算。

输出示例

用你给出的总统任期示例数据,最终输出的格式化任期长度为:

  • 1789-04-30 到 1797-03-04:7 years, 308 days
  • 1797-03-04 到 1801-03-04:4 years, 0 days
  • 1801-03-04 到 1809-03-04:8 years, 0 days
  • 1809-03-04 到 1817-03-04:8 years, 0 days
  • 1817-03-04 到 1825-03-04:8 years, 0 days

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 20:27:00