首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么日期+时间增量变成了日期,而不是日期时间?

为什么日期+时间增量变成了日期,而不是日期时间?
EN

Stack Overflow用户
提问于 2016-05-11 22:38:58
回答 3查看 4.8K关注 0票数 19

在Python语言中,在混合类型的数字运算中,较窄的类型是widened to that of the other,例如int + float float

代码语言:javascript
复制
In [57]: 3 + 0.1
Out[57]: 3.1

但对于datetime.date,我们有datetime.date + datetime.timedelta datetime.date,而不是datetime.datetime

代码语言:javascript
复制
In [58]: datetime.date(2013, 1, 1) + datetime.timedelta(seconds=42)
Out[58]: datetime.date(2013, 1, 1)

为什么扩展推理适用于数字,而不适用于date/datetime/timedelta

(背景:我正在编写一个文件格式的读取例程,其中一个字段是年份,一个字段是一年中的某一天,一个字段是从午夜开始的毫秒数。当然,简单而明确的解决方案是datetime.datetime(2013, 1, 1, 0, 0, 0) + datetime.timedelta(seconds=42),但同样可以推断应该将3 + 0.1重写为3.0 + 0.1)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-11 22:52:48

date不是datetime的子类;datetime是一种复合类型,它将datetime对象组合为一个。在这里,您不能决定从date上的操作生成复合类型;time组件不是日期的一小部分。

另一方面,Python numeric hierarchy将整数定义为一种特殊的浮点数类型(numbers.Integralnumbers.Real的间接子类),因此在整数和浮点数之间的混合操作会产生基类型。并且float不是复合类型,则值的小数部分没有单独的类型。

如果您想从dates上的操作生成复合类型,则必须显式(并且explicit比implicit更好)。自己添加一个时间组件:

代码语言:javascript
复制
datetime.combine(yourdate, time.min) + yourdelta

其中,yourdate可以通过date.strptime('%Y %j')解析您的年份加上年中某一天的输入来生成。

其他方法(或者根据timedelta.seconds值生成datetime对象,或者总是这样)要求程序员再次展开date组件,如果这是他们所期望的全部。

票数 5
EN

Stack Overflow用户

发布于 2016-05-11 22:54:02

timedelta对象不存储任何关于它是否只涉及日期或时间的信息。(小时/分钟/秒/微秒的数量为0可能只是一个巧合!)

因此,假设我们有一个人,他只想操纵日期,忽略时间,她会做像my_new_date = my_old_date + timedelta(days=1)这样的事情。如果她发现my_new_date现在是一个datetime对象而不是date对象,她会感到非常惊讶,也可能会很恼火。

票数 7
EN

Stack Overflow用户

发布于 2016-05-11 22:43:36

当您将时间增量与日期相加时,python将只查找时间增量的days属性。因此,如果添加42秒,日期将为0,不会影响您的日期。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37165952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档