Pandas 熊猫:从截止级别中选择最后四个日期
您好,我有一个日期列表,我想查看日期,如果日期介于1月1日和3月31日之间,则选择该日期作为该特定年份的结束日期,并将前4个日期作为该年份的一部分。(每年只有4个日期,因此在我指定的范围内不会有2个日期。) 我的数据如下所示: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
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