解决Pandas性能警告:如何实现向量化操作?
问题描述
原始代码
mydata = [{'ID' : '10', 'StartDate': '10/10/2016', 'EndDate': '15/10/2016'}, {'ID' : '20', 'StartDate': '10/10/2016', 'EndDate': '18/10/2016'}] df = pd.DataFrame(mydata) df['StartDate'] = pd.to_datetime(df['StartDate']).dt.date df['EndDate'] = pd.to_datetime(df['EndDate']).dt.date df = df.loc[df.index.repeat((df['EndDate'] - df['StartDate']).dt.days + 1)] df['Date'] = df['StartDate'] + pd.to_timedelta(df.groupby(level=0).cumcount(), unit='d')
触发的性能警告
PerformanceWarning: Adding/subtracting object-dtype array to
TimedeltaArray not vectorized.
解决方案
这个警告的问题出在你把pandas的datetime64类型转成了Python原生的date对象(用了.dt.date),导致StartDate列变成了object类型,和TimedeltaArray相加时没法做向量化运算,既慢又触发警告。
修改时只要全程保留pandas的datetime64类型,不要转成原生date对象就行:
mydata = [{'ID' : '10', 'StartDate': '10/10/2016', 'EndDate': '15/10/2016'}, {'ID' : '20', 'StartDate': '10/10/2016', 'EndDate': '18/10/2016'}] df = pd.DataFrame(mydata) # 直接转成datetime64类型,不要转成原生date df['StartDate'] = pd.to_datetime(df['StartDate']) df['EndDate'] = pd.to_datetime(df['EndDate']) # 计算重复次数:datetime64相减得到Timedelta,直接取days df = df.loc[df.index.repeat((df['EndDate'] - df['StartDate']).dt.days + 1)] # 生成日期列:datetime64加Timedelta是完全向量化的操作,无警告 df['Date'] = df['StartDate'] + pd.to_timedelta(df.groupby(level=0).cumcount(), unit='d') # 如果最后确实需要Python原生date类型,再转换(可选) # df['Date'] = df['Date'].dt.date
核心修改说明
- 去掉
.dt.date转换,保留datetime64[ns]类型:这是pandas专门优化的日期格式,支持所有向量化日期运算 - 日期差计算更直接:
df['EndDate'] - df['StartDate']得到Timedelta类型,直接用.dt.days获取天数,效率更高 - 最终日期生成全程向量化:
datetime64与Timedelta相加是pandas原生支持的向量化操作,不会触发性能警告
内容的提问来源于stack exchange,提问作者user13744439
相关产品推荐
相关产品推荐

