Numpy.minimum с Pandas.Series of Timestamps TypeError: Невозможно сравнить 'Timestamp' с 'int' - PullRequest
0 голосов
/ 27 февраля 2019

Я хотел бы векторизовать вычисление перекрытия временных интервалов, используя 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 голосов
/ 27 февраля 2019

Чтобы сделать короткий, вместо использования pd.to_datetime для создания верхней границы, используйте np.datetime64

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] это делает.

Также взгляните на этот ответ , это может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...