Skip to main content
 首页 » 编程设计

python之Pandas 损益汇总到下一个工作日

2025年05月04日18xxx_UU

我很难有效地执行此操作。我在数据框中有一些股票和每日损益信息。实际上,我有数百万行数据,所以效率很重要! 数据框看起来像:

------------------------------- 
| Date       | Security | P&L | 
------------------------------- 
| 2016-01-01 | AAPL     | 100 | 
------------------------------- 
| 2016-01-02 | AAPL     | 200 | 
------------------------------- 
| 2016-01-03 | AAPL     | 300 | 
------------------------------- 
| 2016-01-04 | AAPL     | -200 | 
------------------------------- 

我只想将损益结转至下一个工作日(不包括所有美国假期和周末) 因此,生成的数据框如下所示:

------------------------------- 
| Date       | Security | P&L | 
------------------------------- 
| 2016-01-04 | AAPL     | 400 | 
------------------------------- 

我正在寻找一种有效的方法来实现这一点。不幸的是,我确实有数以千计的证券和超过 5 年的数据需要处理,所以暴力破解是行不通的!

提前致谢,非常感谢任何关于此的指示!

请您参考如下方法:

我们可以创建业务日期的 DataFrame,然后 merge_asof。然后我们可以对此进行分组以获得总和。

import pandas as pd 
from pandas.tseries.holiday import USFederalHolidayCalendar 
 
#df['Date'] = pd.to_datetime(df.Date) 
date_min = '2015-01-01' 
date_max = '2016-12-31' 
 
cal = USFederalHolidayCalendar() 
holidays = cal.holidays(date_min, date_max).tolist() 
df2 = pd.DataFrame({'bdate': pd.bdate_range(date_min, date_max,  
                                            holidays=holidays, freq='C')}) 
 
res = pd.merge_asof(df, df2, left_on='Date', right_on='bdate', direction='forward') 
#        Date Security  P&L      bdate 
#0 2016-01-01     AAPL  100 2016-01-04 
#1 2016-01-02     AAPL  200 2016-01-04 
#2 2016-01-03     AAPL  300 2016-01-04 
#3 2016-01-04     AAPL -200 2016-01-04 
 
res.groupby(['Security', 'bdate'])['P&L'].sum() 
#Security  bdate      
#AAPL      2016-01-04    400