Pandas 熊猫:从截止级别中选择最后四个日期

Pandas 熊猫:从截止级别中选择最后四个日期,pandas,date,datetime,grouping,Pandas,Date,Datetime,Grouping,您好,我有一个日期列表,我想查看日期,如果日期介于1月1日和3月31日之间,则选择该日期作为该特定年份的结束日期,并将前4个日期作为该年份的一部分。(每年只有4个日期,因此在我指定的范围内不会有2个日期。) 我的数据如下所示: date 0 1995-03-15 1 1995-07-06 2 1995-09-13 3 1995-12-12 4 1996-03-14 5 1996-07-01 6

您好,我有一个日期列表,我想查看日期,如果日期介于1月1日和3月31日之间,则选择该日期作为该特定年份的结束日期,并将前4个日期作为该年份的一部分。(每年只有4个日期,因此在我指定的范围内不会有2个日期。)

我的数据如下所示:

         date
0        1995-03-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-12-12
8        1997-03-13
9        1997-06-25
10       1997-09-10
11       1997-12-12
我想要这样的东西(在单独的专栏中)

除其他外,我尝试了以下方法:

df['year'] = df.date.dt.to_period('A-MAR')
但是,我无法通过1月到3月之间的范围…我还想我可能可以从日期列中选择月份:
df['month']=df['date'].dt.month
,然后执行一个函数,从[1到3]之间的日期中选择最后一行(包括)并将年份放在另一列

有人对这个问题有什么想法吗?谢谢

使用:

y = df.date.dt.year
mask = df.date.dt.month.between(1, 3)
df['year'] = y.where(mask).bfill().fillna(y.max() + 1).sub(1).astype(int)
print (df)
         date  year
0  1995-03-15  1994
1  1995-07-06  1995
2  1995-09-13  1995
3  1995-12-12  1995
4  1996-03-14  1995
5  1996-07-01  1996
6  1996-09-17  1996
7  1996-12-12  1996
8  1997-03-13  1996
9  1997-06-25  1997
10 1997-09-10  1997
11 1997-12-12  1997
说明

按月份使用,用于替换
NaN
s到不匹配的值:

print (y.where(df.date.dt.month.between(1, 3)))
0     1995.0
1        NaN
2        NaN
3        NaN
4     1996.0
5        NaN
6        NaN
7        NaN
8     1997.0
9        NaN
10       NaN
11       NaN
Name: date, dtype: float64
然后使用回补缺少的值:

print (y.where(df.date.dt.month.between(1, 3)).bfill())
0     1995.0
1     1996.0
2     1996.0
3     1996.0
4     1996.0
5     1997.0
6     1997.0
7     1997.0
8     1997.0
9        NaN
10       NaN
11       NaN
Name: date, dtype: float64
缺少的值(最后一行)由maximam year替换为添加的
1

print (y.where(df.date.dt.month.between(1, 3)).bfill().fillna(y.max() + 1))
0     1995.0
1     1996.0
2     1996.0
3     1996.0
4     1996.0
5     1997.0
6     1997.0
7     1997.0
8     1997.0
9     1998.0
10    1998.0
11    1998.0
Name: date, dtype: float64
最后减去一年:

print (y.where(df.date.dt.month.between(1, 3)).bfill().fillna(y.max() + 1).sub(1))
0     1994.0
1     1995.0
2     1995.0
3     1995.0
4     1995.0
5     1996.0
6     1996.0
7     1996.0
8     1996.0
9     1997.0
10    1997.0
11    1997.0
Name: date, dtype: float6

@杰兹雷尔,很抱歉打扰你。我还有一个问题与上面的有点类似。。有没有办法选择最接近3月31日的日期,并将其作为一年的最后一个日期,并将前三个日期归类为同一年的一部分?(类似,但不是看范围,而是看3月31日之前最接近的值)(我应该再提交一个问题吗?@Adrian-你能提出新问题吗?现在我不知道了。
print (y.where(df.date.dt.month.between(1, 3)).bfill().fillna(y.max() + 1).sub(1))
0     1994.0
1     1995.0
2     1995.0
3     1995.0
4     1995.0
5     1996.0
6     1996.0
7     1996.0
8     1996.0
9     1997.0
10    1997.0
11    1997.0
Name: date, dtype: float6