Python 计算出50年后的Timedelta,应该是同一天

Python calculated Timedelta 50 years in future, should be same day

这是

的跟进

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

我尝试应用(没有双关语意)相同的逻辑来计算 pandas 时间戳列上的 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 年后的未来!

有人可以解释一下 how/why 这件事发生了吗?没有显式调用 pd.offsets.DateOffset(years=50)

这个问题的解决方案很简单,而且让我眼前一亮。

违规代码:

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

正确 创建时间戳类型 end_time 的方法 series/column:

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