我正在使用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的值。