pandas - 熊猫:从截止级别中选择最后日期
问题描述
我有一个日期列表和一个截止级别: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
如果您对我该如何解决这个问题有任何想法,请告诉我。
解决方案
与由最小和最大年份创建的merge_asof
助手一起使用,它在按列截断之前返回填充值:DataFrame
date_range
df1['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
推荐阅读
- sql - Oracle SQL 收入 YTD 计算
- python - Python绑定公共IP以在没有相同网络的情况下连接
- redis - 数据库选择来实现一个程序来检索实时会话中的前 10 个投票问题
- junit5 - 是否可以在同一个测试文件中混合 jqwik @Property 方法和 junit5 @Test 方法?
- passwords - 此处未经授权映射空白方块
- ruby - 找不到 Gem IO-Console
- sqlalchemy - SQLAlchemy 抛出完整性错误,“更新或删除表违反外键约束”
- python - excel宏的完整文件路径
- php - php codeigniter网站显示未连接到safari ios手机中的服务器
- c++ - C++ 中的字符串是否没有超出范围的异常/错误?