从Dataframe时间序列中提取每月日期

时间:2018-08-20 08:54:32

标签: python pandas time-series

我正在使用Python 2.7.13。

我有一个Pandas数据框,其中每一列都包含工作日作为索引和数字数据。

我正在尝试:

1 /从数据框中提取每月日期。我设法获得了月底日期,但我需要将日期设置为原始日期集的一部分。例如,如果月底是星期日,我需要得到最接近的工作日。

2 /理想情况下,我也在寻找一种获取数据框的优雅方法:与原始数据框具有相同的日期作为索引。对于每一列,第一个值等于原始数据框的值,然后,如果该日期不是每月日期,则该值等于(新数据框的)先前的值,并且如果该日期是每月的日期,则该值等于原始数据框中同一日期的值。

我尝试了几种解决方案,例如merge asof(因为必须对键进行排序(我不理解)而无法正常工作)或对日期之间的距离进行迭代测试(因序列不可迭代而无法工作)

感谢您的帮助

问题已解决:

对于那些感兴趣的人,我找到了解决方案:

为了创建每月的日期,我使用了自定义日历:

CustCal=pd.tseries.offsets.CustomBusinessDay(calendar=BT_Histos.index)

"""then I creat the date with : """

 RebalDates = pd.date_range(start=BTParams['EffectiveStartDate'], end=BTParams['EndDate'], freq=frequency)+ pd.tseries.offsets.Day(dayadd)+ 0*CustCal

示例:

Original                                    What i try to get       
            Col1    Col2    Col3                    Col1    Col2    Col3
15/02/2007  119.770 1.033   1.007       15/02/2007  119.770 1.033   1.007
16/02/2007  119.770 1.034   1.006       16/02/2007  119.770 1.033   1.007
20/02/2007  118.439 1.034   1.009       20/02/2007  119.770 1.033   1.007
21/02/2007  119.326 1.032   1.007       21/02/2007  119.770 1.033   1.007
22/02/2007  118.235 1.031   1.006       22/02/2007  119.770 1.033   1.007
23/02/2007  117.108 1.029   1.003       23/02/2007  119.770 1.033   1.007
26/02/2007  116.975 1.030   1.002       26/02/2007  119.770 1.033   1.007
27/02/2007  114.358 1.003   0.967       27/02/2007  119.770 1.033   1.007
28/02/2007  112.974 1.004   0.972       28/02/2007  119.770 1.033   1.007
01/03/2007  111.271 1.002   0.970       01/03/2007  112.974 1.004   0.972
02/03/2007  110.197 0.997   0.959       02/03/2007  112.974 1.004   0.972
05/03/2007  110.650 0.985   0.950       05/03/2007  112.974 1.004   0.972
06/03/2007  111.847 0.996   0.964       06/03/2007  112.974 1.004   0.972
07/03/2007  111.989 0.995   0.962       07/03/2007  112.974 1.004   0.972
08/03/2007  113.826 1.002   0.969       08/03/2007  112.974 1.004   0.972
09/03/2007  114.190 1.003   0.969       09/03/2007  112.974 1.004   0.972
12/03/2007  112.672 1.004   0.972       12/03/2007  112.974 1.004   0.972
13/03/2007  110.818 0.989   0.952       13/03/2007  112.974 1.004   0.972
14/03/2007  106.480 0.989   0.959       14/03/2007  112.974 1.004   0.972
15/03/2007  108.591 0.997   0.962       15/03/2007  112.974 1.004   0.972
16/03/2007  107.474 0.997   0.958       16/03/2007  112.974 1.004   0.972
19/03/2007  110.579 1.006   0.969       19/03/2007  112.974 1.004   0.972
20/03/2007  111.989 1.011   0.975       20/03/2007  112.974 1.004   0.972
21/03/2007  111.954 1.024   0.992       21/03/2007  112.974 1.004   0.972
22/03/2007  114.864 1.024   0.991       22/03/2007  112.974 1.004   0.972
23/03/2007  115.627 1.025   0.992       23/03/2007  112.974 1.004   0.972
26/03/2007  113.977 1.023   0.993       26/03/2007  112.974 1.004   0.972
27/03/2007  114.136 1.018   0.987       27/03/2007  112.974 1.004   0.972
28/03/2007  112.770 1.012   0.979       28/03/2007  112.974 1.004   0.972
29/03/2007  114.571 1.018   0.983       29/03/2007  112.974 1.004   0.972
30/03/2007  114.775 1.021   0.982       30/03/2007  112.974 1.004   0.972
02/04/2007  113.781 1.022   0.984       02/04/2007  114.775 1.021   0.982
03/04/2007  115.316 1.031   0.994       03/04/2007  114.775 1.021   0.982
04/04/2007  115.582 1.032   0.995       04/04/2007  114.775 1.021   0.982
05/04/2007  116.629 1.034   0.998       05/04/2007  114.775 1.021   0.982
10/04/2007  118.421 1.037   1.001       10/04/2007  114.775 1.021   0.982

07年2月28日是星期三,因此它是有效的每月日期。新数据框的下一个工作日(01/03/07)的值是原始数据帧的28/02/07的值。 31/03/07是一个星期六,所以我将30/03/07作为每月的日期。下一个工作日(02/04/07)的值是30/03/07的值。

0 个答案:

没有答案