我遇到的错误可能是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]
给出错误(这次是预期的,因为两个结果时间序列具有未对齐的索引)。
答案 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.