python - 根据时间范围对 pandas df 进行子集化
问题描述
我的 df 看起来像这样并且相当大:
contract time Open High Low Last
0 CME/TYH2018 2017-09-18 125.687500 125.750000 125.687500 125.750000
1 CME/TYH2018 2017-09-20 125.703125 125.750000 125.234375 125.375000
2 CME/TYH2018 2017-09-22 125.609375 125.609375 125.437500 125.484375
3 CME/TYH2018 2017-09-25 125.687500 125.812500 125.687500 125.765625
4 CME/TYH2018 2017-09-26 125.640625 125.796875 125.562500 125.625000
5 CME/TYH2018 2017-09-27 125.171875 125.218750 125.031250 125.125000
371 CME/TYZ2018 2018-07-12 119.984375 120.062500 119.859375 120.015625
372 CME/TYZ2018 2018-07-13 120.156250 120.234375 120.078125 120.218750
373 CME/TYZ2018 2018-07-16 120.000000 120.031250 119.859375 120.000000
374 CME/TYZ2018 2018-07-17 119.968750 120.046875 119.890625 119.953125
375 CME/TYZ2018 2018-07-18 119.875000 120.062500 119.843750 119.890625
我希望按如下方式对数据进行切片。对于每个独特的合约,请像这样进行切片:
每个合约的数据开始:
df.loc[df.contract=='CME/TYH2018'].time.max() - datetime.timedelta(days=100)
并丢弃所有其他行。
解决方案
使用GroupBy.transform
与相同大小的max
for ,减去 timedelta 和最后一个过滤器:Series
DataFrame
boolean indexing
shifted = df.groupby('contract')['time'].transform('max') - pd.Timedelta(100, unit='d')
df = df[df['time'] > shifted]
用样本数据测试3 days
:
shifted = df.groupby('contract')['time'].transform('max') - pd.Timedelta(3, unit='d')
df = df[df['time'] > shifted]
print (df)
contract time Open High Low Last
3 CME/TYH2018 2017-09-25 125.687500 125.812500 125.687500 125.765625
4 CME/TYH2018 2017-09-26 125.640625 125.796875 125.562500 125.625000
5 CME/TYH2018 2017-09-27 125.171875 125.218750 125.031250 125.125000
373 CME/TYZ2018 2018-07-16 120.000000 120.031250 119.859375 120.000000
374 CME/TYZ2018 2018-07-17 119.968750 120.046875 119.890625 119.953125
375 CME/TYZ2018 2018-07-18 119.875000 120.062500 119.843750 119.890625
推荐阅读
- java - 如何获取密钥取决于地图地图中的值
- amazon-web-services - 即使使用新的 EC2 实例,AWS SSH 登录仍会继续失败 [权限被拒绝(公钥)]
- processing - 单击按钮后如何清除画布和按钮(及其功能)?
- hash - 我应该对 CoreOS 点火文件使用什么密码散列方法?
- sharepoint - Sharepoint 计算列,从日期中提取月份和年份,然后增加月份
- heroku - 尝试从受 JWT Gem 保护的 API 获取用户时“没有可用的验证密钥”
- assembly - 在 VirtualBox 上运行 BootSector
- reactjs - Gatsby 在 Netlify 上构建失败
- python - 类的索引成员作为python中的列表
- python - Pygame:问题源于使用键盘输入的 update() 函数