熊猫:从截止水平中选择最后四个日期

时间:2019-04-06 12:09:53

标签: 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        1996-09-17
7        1996-12-12
8        1997-03-13
9        1997-06-25
10       1997-09-10
11       1997-12-12

我想有这样的事情(在另一列中)

          year
0         1994
1         1995
2         1995
3         1995
4         1995
5         1996
6         1996
7         1996
8         1996
9         1997
10        1997
11        1997

除其他事项外,我尝试了以下操作:

df['year'] = df.date.dt.to_period('A-MAR')

但是,我无法在1月到3月之间传递范围...我还想,我可能只能使用df['month'] = df['date'].dt.month从日期列中选择月份,然后执行一个选择从[1到3](包括)之间的日期起最后一行,并将年份放入另一列?

有人对这个问题有任何想法吗?谢谢!

1 个答案:

答案 0 :(得分:2)

使用:

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

说明

Series.between按月与Series.where一起使用,以将NaN替换为不匹配的值:

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

缺少的值(最后一行)被最大年份替换为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