如何筛选numpy datetime数组中大于指定时间的元素?解决类型错误
解决numpy datetime64数组与Python datetime比较的类型错误
这个问题我之前也碰到过,本质是numpy的datetime64类型数组和Python原生datetime.datetime对象直接比较时的类型不兼容,numpy在尝试自动转换类型时出现了混乱,才抛出了TypeError: '>' not supported between instances of 'int' and 'datetime.datetime'这个错误。
错误原因
你的myArray是numpy的datetime64类型数组,但myDatetime是Python原生的datetime.datetime对象。当你执行myArray>myDatetime时,numpy会尝试把myDatetime转换成能和数组匹配的类型,但这个过程中意外将其转成了时间戳的整数形式,导致整数和datetime.datetime对象的无效比较。
解决方案
这里有两种简单可行的解决方法:
方法1:将Python datetime转换为numpy datetime64类型
让比较的两边类型统一为numpy的datetime64,就能正常执行筛选:
import numpy as np import pandas as pd myRange = pd.date_range('2018-04-09', periods=5, freq='1D20min') myArray = np.array(myRange).astype(np.datetime64).reshape(-1,1) myDatetime = pd.datetime(2018,4,10,2,59,59) # 把Python datetime转成numpy datetime64类型 myDatetime_np = np.datetime64(myDatetime) # 执行筛选 filtered_array = myArray[myArray > myDatetime_np] print(filtered_array)
执行后会输出符合条件的元素:
[['2018-04-11T00:40:00.000000000'] ['2018-04-12T01:00:00.000000000'] ['2018-04-13T01:20:00.000000000']]
方法2:直接用pandas时间序列处理(更简洁)
既然你已经用了pandas生成时间范围,直接用pandas的DatetimeIndex进行筛选会更省心,完全避免类型兼容问题:
import pandas as pd myRange = pd.date_range('2018-04-09', periods=5, freq='1D20min') myDatetime = pd.datetime(2018,4,10,2,59,59) # 直接筛选DatetimeIndex filtered_range = myRange[myRange > myDatetime] # 如果需要转成numpy数组的格式 filtered_array = filtered_range.to_numpy().reshape(-1,1) print(filtered_array)
这种方法代码更简洁,pandas对时间序列的处理本身就比numpy更友好,推荐优先使用。
内容的提问来源于stack exchange,提问作者user7468395
相关产品推荐
相关产品推荐

