使用apply()和DateOffset向Pandas DataFrame中的datetime值添加月份时的PerformanceWarning

wyyhbhjk  于 2023-03-21  发布在  其他
关注(0)|答案(1)|浏览(194)

我有一个Pandas DataFrame,其中**“date”列包含datetime值,“months”**列包含整数值,表示要添加到每个日期的月数。我想为每行计算一个新日期,即原始“date”加上months列中指定的月数。
我使用下面的代码:

df['date'] + df["months"].apply(lambda y: pd.DateOffset(months=y))

这段代码似乎工作正常,但我收到一个PerformanceWarning,内容是:

PerformanceWarning: Adding/subtracting object-dtype array to DatetimeArray not vectorized
  warnings.warn

我需要在数据集中使用多个日期和月份列来执行此过程,并且需要很长时间来执行此任务。
输入示例:
| | 日期|月|
| - ------|- ------|- ------|
| 无|2020年1月1日|三个|
| 1个|二〇二一年六月十五日|六个|
| 第二章|2022年2月28日|1个|
输出样本:
| | 日期|月|新日期|
| - ------|- ------|- ------|- ------|
| 无|2020年1月1日|三个|2020年4月1日|
| 1个|二〇二一年六月十五日|六个|二〇二一年十二月十五日|
| 第二章|2022年2月28日|1个|二○二二年三月二十八日|
这个警告是什么意思,我如何改进我的代码来避免它?我担心这可能会影响我的代码的性能,我想确保它尽可能的高效。

vxqlmq5t

vxqlmq5t1#

您可以通过在日期列上使用.dt.date来删除性能警告。
要获得更快的性能,可以使用dateutil.relativedelta

from dateutil.relativedelta import relativedelta

df['new_date'] = df['date'].dt.date + df["months"].apply(lambda y: relativedelta(months=y))
print(df)

打印(无性能警告):

date  months    new_date
0 2020-01-01       3  2020-04-01
1 2021-06-15       6  2021-12-15
2 2022-02-28       1  2022-03-28

快速基准测试:

from timeit import timeit
from dateutil.relativedelta import relativedelta

def fn1(df):
    return df['date'].dt.date + df["months"].apply(lambda y: pd.DateOffset(months=y))

def fn2(df):
    return df['date'].dt.date + df["months"].apply(lambda y: relativedelta(months=y))

# create bigger dataframe
df = pd.concat([df]*100).reset_index(drop=True)

t1 = timeit('fn1(x)', setup='x = df.copy()', number=100, globals=globals())
t2 = timeit('fn2(x)', setup='x = df.copy()', number=100, globals=globals())

print(t1)
print(t2)

图纸:

0.6759202829562128
0.2161861159838736

相关问题