我的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)
并丢弃所有其他行。
答案 0 :(得分:2)
将GroupBy.transform
与max
一起用于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