带有numpy.maximum的Pandas Datetimeindex会出错

时间:2018-02-12 10:47:12

标签: python python-3.x pandas numpy

我遇到的错误可能是pandas中的错误(在Windows上为0.22,Python版本为3.6.3),或者更确切地说是与NumPy(v.1.14)的交互,但我想知道我是否#39;我错过了更深刻的东西。

问题在于:如果我有两个长度相同的Datetimeindex个对象,并且在它们之间使用np.maximum,则输出符合预期:

import pandas as pd
import numpy as np
v1 = pd.DatetimeIndex(['2016-01-01', '2018-01-02', '2018-01-03'])
v2 = pd.DatetimeIndex(['2017-01-01', '2017-01-02', '2019-01-03'])
np.maximum(v1, v2)

返回elementwise最大值:

  

DatetimeIndex([' 2017-01-01',' 2018-01-02',' 2019-01-03'],dtype =&# 39; datetime64 [ns]',freq = None)

但是,如果我尝试仅使用两者中的一个元素,我会收到错误:

np.maximum(v1, v2[0])
  pandas._libs.tslib._Timestamp中的

pandas_libs \ tslib.pyx。 richcmp ()

     

TypeError:无法比较类型'时间戳'类型' int'

两个可行的解决方法,但两者都很难写,要么使用切片要么显式转换为pydatetime:

np.maximum(v1, v2[:1])
  

DatetimeIndex([' 2017-01-01',' 2018-01-02',' 2018-01-03'],dtype =&# 39; datetime64 [ns]',freq = None)

或:

v1.to_pydatetime() - v2[0].to_pydatetime()
  

array([datetime.datetime(2017,1,1,0,0),          datetime.datetime(2018,1,2,0,0),          datetime.datetime(2018,1,3,0,0)],dtype = object)

第一种解决方法实际上非常奇怪,因为执行v2 - v1[0]工作正常,而v2 - v1[:1]给出错误(这次是预期的,因为两个结果时间序列具有未对齐的索引)。

3 个答案:

答案 0 :(得分:1)

一种解决方案是转换为pd.Series,然后使用https://tls.mbed.org/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS

pd.Series(v1).clip(v2[0])

# 0   2017-01-01
# 1   2018-01-02
# 2   2018-01-03
# dtype: datetime64[ns]

答案 1 :(得分:0)

TypeError: Cannot compare type 'Timestamp' with type 'long'

这是您将使用此错误 -

np.maximum(v1, v2[0])

为什么会收到此错误?考虑一下。答案是类型错误本身。您正在比较2种类型不同的东西。

为了与第二时间戳中的单个元素进行比较,您可以使用 -

print(np.maximum(v1, v2[1:2]))
print(np.maximum(v1, v2[:1]))
print(np.maximum(v1, v2[2:3]))

希望这能解决您的问题。

答案 2 :(得分:0)

根据np.maximum的文档,行为是预期的。请注意,操作v1[0]称为选择,并返回单个TimeStamp ,而v[:1]已知 切片 并返回一个数组。

这是help(np.maximum)输出

的一部分
|  
 |  op(X, Y, out=None)
 |  Apply `op` to `X` and `Y` elementwise. May "broadcast" to make
 |  the shapes of `X` and `Y` congruent.
 |  
 |  The broadcasting rules are:
 |  
 |  * Dimensions of length 1 may be prepended to either array.
 |  * Arrays may be repeated along dimensions of length 1.
 |  
 |  Parameters
 |  ----------
 |  X : array_like
 |      First input array.
 |  Y : array_like
 |      Second input array.
 |  out : array_like
 |      An array to store the output. Must be the same shape as the
 |      output would have.
 |  
 |  Returns
 |  -------
 |  r : array_like
 |      The return value; if out is provided, `r` will be equal to out.