Numpy.minimum与Pandas.Series的时间戳TypeError:无法将“时间戳”与“ int”进行比较

时间:2019-02-27 15:37:30

标签: python pandas numpy time-series

我想使用np.minimum上的pd.Series对时间间隔的重叠进行矢量化处理:

np.minimum(
    pd.to_datetime('2018-01-16 21:43:00'),
    pd.Series([pd.to_datetime('2018-01-16 21:44:00'), pd.to_datetime('2018-01-16 21:41:00')]))

但是,这将导致以下TypeError

TypeError                                 Traceback (most recent call last)
<ipython-input-84-07083aa6dce1> in <module>()
    1 np.minimum(
    2     pd.to_datetime('2018-01-16 21:43:00'),
----> 3     pd.Series([pd.to_datetime('2018-01-16 21:44:00'), pd.to_datetime('2018-01-16 21:41:00')]))

pandas\_libs\tslibs\timestamps.pyx in pandas._libs.tslibs.timestamps._Timestamp.__richcmp__()

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

使用np.array就像一个超级按钮(不使用.values一样):

np.minimum(
    pd.Series([1, pd.to_datetime('2018-01-16 21:43:00')])[1], 
    np.array([pd.to_datetime('2018-01-16 21:44:00'), pd.to_datetime('2018-01-16 21:41:00')]))

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

要简短起见,请使用np.datetime64

,而不要使用pd.to_datetime来创建上限。
s = pd.Series([pd.to_datetime('2018-01-16 21:44:00'), pd.to_datetime('2018-01-16 21:41:00')])
print (np.minimum(s, np.datetime64('2018-01-16 21:43:00')))
0   2018-01-16 21:43:00
1   2018-01-16 21:41:00
dtype: datetime64[ns]

甚至这个np.minimum(s, pd.to_datetime('2018-01-16 21:43:00').to_datetime64())都可以。

更多内容:如果同时查看dtype或什至创建数据的两种方式的元素表示形式,您都可以看到差异。

print (s.values)
array(['2018-01-16T21:44:00.000000000', '2018-01-16T21:41:00.000000000'],
      dtype='datetime64[ns]')
print (np.array([pd.to_datetime('2018-01-16 21:44:00'), pd.to_datetime('2018-01-16 21:41:00')]))
array([Timestamp('2018-01-16 21:44:00'), Timestamp('2018-01-16 21:41:00')],
      dtype=object)

一种有趣的方式是更改s.values的类型,例如:

print (np.minimum(s.values.astype('datetime64[s]'), 
                  pd.to_datetime('2018-01-16 21:43:00')))
array([Timestamp('2018-01-16 21:43:00'),
       datetime.datetime(2018, 1, 16, 21, 41)], dtype=object)

它可以工作,但是您可以看到一个是Timestamp,另一个是datetime,看来当s.values的类型是datetime[ns]时,比较是datetime64[s]甚至datetime64[ms]都无法做到。

也可以看看这个answer,这可能会有所帮助。