首页 > 解决方案 > 熊猫:从截止级别中选择最后日期

问题描述

我有一个日期列表和一个截止级别:3 月 31 日。我想查看 3 月 31 日之前的第一个日期,并将其设为一年中的最后一个日期,然后选择之前的最后 3 个日期并将它们放入 1 年。(例如:如果我们看 1997 年,1997 年 3 月之前的第一个日期是:索引 8,日期:1996-12-13。现在我想回顾 3 个日期并将它们放在同一年 1997 下,即索引 7 ,6 和 5 | 与 1995 年相同,1995 年 3 月之前的第一个日期是索引 0,日期:1994-12-15,但索引 0 之前没有可用数据)。

我的数据如下所示:

    date
0   1994-12-15
1   1995-07-06
2   1995-09-13
3   1995-12-12
4   1996-03-14
5   1996-07-01
6   1996-09-17
7   1996-11-12
8   1996-12-13
9   1997-06-25
10  1997-09-10
11  1997-12-12

我希望它看起来如下:

    date        year
0   1994-12-15  1995
1   1995-07-06  1996
2   1995-09-13  1996
3   1995-12-12  1996
4   1996-03-14  1996
5   1996-07-01  1997
6   1996-09-17  1997
7   1996-11-12  1997
8   1996-12-13  1997
9   1997-06-25  1998
10  1997-09-10  1998
11  1997-12-12  1998

如果您对我该如何解决这个问题有任何想法,请告诉我。

标签: pandasdatedatetimegrouping

解决方案


与由最小和最大年份创建的merge_asof助手一起使用,它在按列截断之前返回填充值:DataFramedate_rangedf1['year']

y = df['date'].dt.year
#added +-1 year (not necessary)
miny = y.min() - 1
maxy = y.max() + 2

df1 = pd.DataFrame({'date':pd.date_range(f'{miny}-03-31', f'{maxy}-03-31', freq='A-Mar')})
df1['year'] = df1['date'].dt.year  + 1
print (df1)
        date  year
0 1993-03-31  1994
1 1994-03-31  1995
2 1995-03-31  1996
3 1996-03-31  1997
4 1997-03-31  1998
5 1998-03-31  1999
6 1999-03-31  2000

df = pd.merge_asof(df,df1,on='date')
print (df)
         date  year
0  1994-12-15  1995
1  1995-07-06  1996
2  1995-09-13  1996
3  1995-12-12  1996
4  1996-03-14  1996
5  1996-07-01  1997
6  1996-09-17  1997
7  1996-12-12  1997
8  1996-12-13  1997
9  1997-06-25  1998
10 1997-09-10  1998
11 1997-12-12  1998

推荐阅读