使用np.minimum计算pd.Series时间戳最小值触发TypeError求助
我来帮你分析下这个问题的原因,以及几个可行的解决思路:
错误原因
当你调用np.minimum时,numpy会尝试对输入的两个对象进行类型统一。这里你传入了一个单个Timestamp对象和一个pd.Series(元素是Timestamp),numpy会把单个Timestamp转换成它底层的int64数值(也就是Unix时间戳的毫秒/纳秒数),但Series里的元素依然是Timestamp对象,这就导致了类型不匹配——int和Timestamp没法直接比较,所以抛出了TypeError: Cannot compare type 'Timestamp' with type 'int'。
而你用np.array替代pd.Series时,numpy会把数组里的Timestamp统一转换成datetime64类型,这时候和单个Timestamp对比就没问题了,因为numpy能正确处理datetime64类型的元素级最小计算。
解决思路
思路1:使用pandas Series内置的minimum方法
pandas已经为Series提供了专门的元素级最小计算方法,它能正确处理Timestamp类型,不会出现numpy的类型转换问题:
import pandas as pd import numpy as np target_time = pd.to_datetime('2018-01-16 21:43:00') time_series = pd.Series([ pd.to_datetime('2018-01-16 21:44:00'), pd.to_datetime('2018-01-16 21:41:00') ]) # 使用Series的minimum方法 result = time_series.minimum(target_time) print(result)
输出:
0 2018-01-16 21:43:00 1 2018-01-16 21:41:00 dtype: datetime64[ns]
思路2:把Series转换成numpy datetime64数组
既然你用np.array能成功,也可以直接提取Series的numpy数组来计算,这样numpy就能正确识别类型:
result = np.minimum(target_time, time_series.values) # 如果你需要转回Series,可以再包装一下 result_series = pd.Series(result)
思路3:将标量Timestamp转换成同长度的Series
让两个输入都是Series类型,pandas会自动对齐并处理类型:
target_series = pd.Series([target_time] * len(time_series)) result = np.minimum(target_series, time_series)
不过这种方法不如前两种高效,尤其是当Series很大的时候,因为需要创建一个和原Series等长的新Series。
总结
优先选择思路1,因为它是pandas原生的方法,代码更简洁,类型处理更安全,性能也更优。如果一定要用numpy的np.minimum,那么思路2是更高效的选择。
内容的提问来源于stack exchange,提问作者germannp

