您好,我有一个日期列表,我想查看日期,如果某个日期在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](包括)之间的日期起最后一行,并将年份放入另一列?
有人对这个问题有任何想法吗?谢谢!
答案 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