python - 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)
解决方案
解决这个问题很简单,而且盯着我的脸。
违规代码:
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))
推荐阅读
- wcf - 如何将数组添加到 WCF 数据协定?
- python - 使用 argparse 时出现“无效选择”错误
- ios - 将我的项目文件夹移动到另一个位置,现在 xcworkspace 无法与我的主项目一起打开
- c - 给定现有路径时,Fopen 函数返回 null
- postman - 从邮递员导出结果,以便可以使用邮递员以外的工具(例如浏览器、csv)查看它们
- angular - 是否可以自定义材料的日期选择器主体?
- javascript - Nodejs Asynchronous reusable function call
- web-scraping - 抓取电子商务网站并聚合相同的产品
- python - 使用列表理解的单行“for”循环
- node.js - 使用 ajax 在不刷新站点的情况下更改 mongoDB 中的某些项目