首页 > 解决方案 > Python计算未来50年的Timedelta,应该是同一天

问题描述

这是根据下一行列值计算数据框中的新列值的后续行动

上一个问题中的解决方案适用于将 hh:mm:ss 值作为字符串保存的列。

我尝试应用(不是双关语)相同的逻辑来计算一列熊猫时间戳的 1 秒差异:

# df.start_time is now of type <class 'pandas._libs.tslibs.timestamps.Timestamp'>
# in yyyy-dd-mm hh:mm:ss format
s = pd.to_timedelta(df.start_time).shift(-1).sub(pd.offsets.Second(1))
df = df.assign( end_time=s.add(pd.Timestamp('now').normalize()).dt.time.astype(str) )

在一轮编码中错误地我将系列作为列应用到df的行更改为:

df = df.assign( end_time=s.add(pd.Timestamp('now').normalize()))

结果……很有趣。end_time 格式正确,但日期部分...

    start_time                   end_time
2021-03-30 16:58:13     2072-06-28 03:17:30.192227
2021-03-30 17:00:00     2072-06-28 03:17:32.192227

我预计 end_time Timedelta 比 start_time 少 1 秒。如您所见,事实并非如此!end_time Timedelta 是未来 51 年!

有人可以解释这是如何/为什么发生的吗?没有明确的调用pd.offsets.DateOffset(years=50)

标签: pythonpandastimestamptimedelta

解决方案


解决这个问题很简单,而且盯着我的脸。

违规代码:

s = pd.to_timedelta(df.start_time).shift(-1).sub(pd.offsets.Second(1))

从时间戳类型系列/列创建 end_time的正确方法:

s = pd.to_timestamp(df.start_time).shift(-1).sub(pd.offsets.Second(1))

推荐阅读