我想使用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')]))
有什么想法吗?
答案 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,这可能会有所帮助。