代码之家  ›  专栏  ›  技术社区  ›  steff

基于时间范围的熊猫df子集

  •  2
  • steff  · 技术社区  · 6 年前

        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)
    

    并丢弃所有其他行。

    1 回复  |  直到 6 年前
        1
  •  2
  •   jezrael    6 年前

    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