gpt4 book ai didi

python - 具有不同偏移向量的 Pandas 向量化日期偏移操作

转载 作者:太空狗 更新时间:2023-10-30 02:26:44 27 4
gpt4 key购买 nike

我正在尝试执行以下操作,但似乎不支持此模式下的矢量化操作。

import pandas as pd
df=pd.DataFrame([[2017,1,15,1],
[2017,1,15,2],
[2017,1,15,3],
[2017,1,15,4],
[2017,1,15,5],
[2017,1,15,6],
[2017,1,15,7]],
columns=['year','month','day','month_offset'])
df['date']=df.apply(lambda g: pd.datetime(g.year,g.month,g.day),axis=1)
df['offset']=df.apply(lambda g: pd.offsets.MonthEnd(g.month_offset),axis=1)
df['date_offset']=df.date+df.offset

这是代码段中最后一条语句返回的警告:

C:\Python3.5.2.3\WinPython-64bit-3.5.2.3\python-3.5.2.amd64\lib\site-packages\pandas\core\ops.py:533: PerformanceWarning: Adding/subtracting array of DateOffsets to Series not vectorized "Series not vectorized", PerformanceWarning)

由于性能优势,我希望将其用作矢量化操作。

谢谢。

编辑

最后,比较来自@john-zwinck 的方法:

import time
import pandas as pd
import numpy as np

df=pd.DataFrame([[2017,1,1,1],
[2017,1,1,2],
[2017,1,1,3],
[2017,1,1,4],
[2017,1,1,5],
[2017,1,1,6],
[2017,1,1,7]],
columns=['year','month','day','month_offset'])

df['mydate']=df.apply(lambda g:
pd.datetime(g.year,g.month,g.day),axis=1)
start_time=time.time()
df['pandas_offset']=df.apply(lambda g: g.mydate +
pd.offsets.MonthEnd(g.month_offset),axis=1)
end_time=time.time()
print('Method1 {} seconds'.format(end_time-start_time))

start_time=time.time()
df['numpy_offset']=(df.mydate.values.astype('M8[M]')+
df.month_offset.values * np.timedelta64(1, 'M')).astype('M8[D]') -
np.timedelta64(1, 'D')
end_time=time.time()
print('Method3 with numpy vectorization {} seconds'.format(end_time-
start_time))

结果:

index year  month  day  month_offset     mydate    offset1      final
0 2017 1 1 1 2017-01-01 2017-01-31 2017-01-31
1 2017 1 1 2 2017-01-01 2017-02-28 2017-02-28
2 2017 1 1 3 2017-01-01 2017-03-31 2017-03-31
3 2017 1 1 4 2017-01-01 2017-04-30 2017-04-30
4 2017 1 1 5 2017-01-01 2017-05-31 2017-05-31
5 2017 1 1 6 2017-01-01 2017-06-30 2017-06-30
6 2017 1 1 7 2017-01-01 2017-07-31 2017-07-31


runfile('C:/bitbucket/test/vector_dates.py', wdir='C:/bitbucket/test')
Method 1 0.003999948501586914 seconds
Method 2 with numpy vectorization 0.0009999275207519531 seconds

显然 numpy 快得多

最佳答案

实现此目的的真正矢量化方法是从 month_offset 构造一个 numpy.timedelta64 数组,将其添加到日期数组,然后减去 numpy .timedelta64(1, 'D') 返回上个月的最后一天。

使用 apply(lambda) 的解决方案可能要慢得多。正如警告所说,一些 Pandas 日期偏移操作未矢量化。如果您的数据很大,最好避免使用它们。 busday_offset()timedelta64 等 NumPy 工具性能完好。

关于python - 具有不同偏移向量的 Pandas 向量化日期偏移操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44003107/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com