如何让大熊猫TimedeltaIndex成为分母?

时间:2018-03-11 02:08:51

标签: python pandas

我试图通过TimedeltaIndex划分一个pandas(0.22.0)Timedelta来获得一个小数值的Float64Index。例如:

>>> td_index = pd.TimedeltaIndex(['1 days', '2 days', '3 days'])
>>> td_index
TimedeltaIndex(['1 days', '2 days', '3 days'], dtype='timedelta64[ns]', freq=None)
>>> td = pd.Timedelta('1D')
>>> td
Timedelta('1 days 00:00:00')
>>> td_index / td  # expected, like division
Float64Index([1.0, 2.0, 3.0], dtype='float64')
>>> td / td_index  # unexpected, why the same as above?
Float64Index([1.0, 2.0, 3.0], dtype='float64')
>>> td.total_seconds() / td_index.total_seconds()  # this works in a pinch
Float64Index([1.0, 0.5, 0.3333333333333333], dtype='float64'

似乎这些前者,即分母中具有Timedelta的那个,可以被认为是"frequency conversion",但我不确定为什么将指数放在分母中会有相同的行为,尤其是当这种行为与其他索引所表现出的不同时。例如,这似乎不适用于直接使用Float64Index:

>>> pd.Float64Index([1, 2, 3]) / 1)
Float64Index([1.0, 2.0, 3.0], dtype='float64')
>>> 1 / pd.Float64Index([1, 2, 3]))
Float64Index([1.0, 0.5, 0.3333333333333333], dtype='float64')  # the behavior I want
  1. 为什么大熊猫Timedeltas和TimedeltaIndexes会这样?
  2. 有没有办法用TimedeltaIndex和Timedelta实现浮点式划分,即没有先转换为不同的表示(如.total_seconds())?

1 个答案:

答案 0 :(得分:1)

这只能完全回答你的第二个问题。

为什么pandas Timedeltas和TimedeltaIndexes就像这样?

您可以查看source code,特别是__truediv__,您可以在其中查看各种类型的除法逻辑。

有没有办法用TimedeltaIndex和Timedelta实现浮点式划分?

没有。从源代码来看,所有比较,在后台,涉及在应用除法之前转换或检索浮点数。这是有道理的,因为datetime对象是建立在数字数据上的。

您的timedelta个对象存储在ns内部。例如,td.deltatd.value都返回86400000000000。

当然,你没有理由需要转换为秒。 td.days / td_index.days也可以。