在Python语言中,在混合类型的数字运算中,较窄的类型是widened to that of the other,例如int
+ float
float
→
In [57]: 3 + 0.1
Out[57]: 3.1
但对于datetime.date
,我们有datetime.date
+ datetime.timedelta
datetime.date
,而不是datetime.datetime
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
)。
发布于 2016-05-11 22:52:48
date不是datetime的子类;datetime是一种复合类型,它将date
和time
对象组合为一个。在这里,您不能决定从date
上的操作生成复合类型;time
组件不是日期的一小部分。
另一方面,Python numeric hierarchy将整数定义为一种特殊的浮点数类型(numbers.Integral
是numbers.Real
的间接子类),因此在整数和浮点数之间的混合操作会产生基类型。并且float
不是复合类型,则值的小数部分没有单独的类型。
如果您想从dates上的操作生成复合类型,则必须显式(并且explicit比implicit更好)。自己添加一个时间组件:
datetime.combine(yourdate, time.min) + yourdelta
其中,yourdate
可以通过date.strptime('%Y %j')
解析您的年份加上年中某一天的输入来生成。
其他方法(或者根据timedelta.seconds
值生成datetime
对象,或者总是这样)要求程序员再次展开date组件,如果这是他们所期望的全部。
发布于 2016-05-11 22:54:02
timedelta
对象不存储任何关于它是否只涉及日期或时间的信息。(小时/分钟/秒/微秒的数量为0可能只是一个巧合!)
因此,假设我们有一个人,他只想操纵日期,忽略时间,她会做像my_new_date = my_old_date + timedelta(days=1)
这样的事情。如果她发现my_new_date
现在是一个datetime
对象而不是date
对象,她会感到非常惊讶,也可能会很恼火。
发布于 2016-05-11 22:43:36
当您将时间增量与日期相加时,python将只查找时间增量的days属性。因此,如果添加42秒,日期将为0,不会影响您的日期。
https://stackoverflow.com/questions/37165952
复制相似问题