如何在NumPy中为日期增减时间间隔?日期减月报错求助
错误原因分析及解决方案
各错误原因拆解
第一个错误(
np.timedelta64(-5,'M'))
numpy的timedelta64基于固定时长的时间差单位,而月份是可变长度的(比如2月28天、1月31天),numpy不支持直接对datetime64[ns]类型数组加减可变长度的月份单位。同时,timedelta64('M')和datetime64[ns]属于不同类型的时间单位,numpy的same_kind转换规则不允许跨这类单位的隐式转换,因此抛出类型转换错误。第二个错误(
relativedelta(months=-5))relativedelta是dateutil库的Python对象(dtype为O即object类型),而dates是numpy的datetime64[ns]类型数组。numpy的通用函数(ufunc)无法处理numpy原生日期类型与Python对象类型的混合运算,找不到对应的加法实现,所以报错。第三个错误(
datetime.fromtimestamp(...))dates.astype(datetime)无法将整个numpy数组转为Python的datetime对象数组,而是试图把数组作为整体转换为单个datetime类型,这本身不成立。另外,datetime.fromtimestamp()仅接受标量时间戳,传入数组自然触发“只能用整数标量数组转换为标量索引”的错误。
可行解决方案
方案1:dateutil.relativedelta结合numpy向量化处理
import numpy as np from dateutil.relativedelta import relativedelta dates = np.array(['2023-02-28T00:00:00.000000000','2022-12-31T00:00:00.000000000','2019-01-01T00:00:00.000000000'], dtype=np.datetime64) # 定义向量化函数逐个处理数组元素 subtract_months = np.vectorize(lambda dt: dt.astype('datetime64[us]').astype(object) + relativedelta(months=-5)) result = subtract_months(dates) print(result)
方案2:改用Pandas(更简洁)
Pandas对日期数组的月份加减支持更友好:
import pandas as pd import numpy as np dates = np.array(['2023-02-28T00:00:00.000000000','2022-12-31T00:00:00.000000000','2019-01-01T00:00:00.000000000'], dtype=np.datetime64) # 转成Pandas的DatetimeIndex后直接加减月份 pd_dates = pd.DatetimeIndex(dates) result = pd_dates - pd.DateOffset(months=5) print(result.values) # 转回numpy数组(可选)
内容的提问来源于stack exchange,提问作者Serge Kashlik
相关产品推荐
相关产品推荐

