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

提高大熊猫日期时间比较的性能

  •  0
  • muni  · 技术社区  · 7 年前

    我有一个熊猫数据框,它的值如下:

    df['ORDER_RECEIVED_DATE'].head()
    Out[91]: 
    0   2018-01-01
    1   2018-01-01
    2   2018-01-01
    3   2018-01-01
    4   2018-01-01
    

    我定义了一个自定义函数来创建另一列“Period”,这取决于与“ORDER_RECEIVED_date”中的日期值的比较

    def period(x):
        if x<pd.to_datetime('01-04-2018'):
            y=0
        elif x<pd.to_datetime('04-05-2018'):
            y=1
        elif x<pd.to_datetime('05-31-2018'):
            y=2
        elif x<pd.to_datetime('08-02-2018'):
           y=3
        elif x<pd.to_datetime('09-27-2018'):
            y=4
        elif x<pd.to_datetime('01-03-2019'):
            y=5
        elif x<pd.to_datetime('02-14-2019'):
            y=6
        elif x<pd.to_datetime('03-28-2019'):
            y=7
        else:
            y=8
        return y
    

    最后将其应用于熊猫专栏:

    df['Period'] = df['ORDER_RECEIVED_DATE'].apply(lambda x:period(x))
    

    但它在约100万张唱片上的速度非常慢。我怎样才能加快速度?

    1 回复  |  直到 7 年前
        1
  •  1
  •   piRSquared    7 年前

    假设你做了一个日期数组

    dates = pd.to_datetime([
        '01-04-2018', '04-05-2018', '05-31-2018',
        '08-02-2018', '09-27-2018', '01-03-2019',
        '02-14-2019', '03-28-2019'
    ]).values
    

    你可以用 searchsorted 这将告诉你每个比较日期所属的职位 dates

    df.assign(Period=dates.searchsorted(df.ORDER_RECEIVED_DATE))
    
       ORDER_RECEIVED_DATE  Period
    0           2018-01-01       0
    1           2018-02-01       1
    2           2018-03-01       1
    3           2018-04-01       1
    4           2018-05-01       2
    5           2018-06-01       3
    6           2018-07-01       3
    7           2018-08-01       3
    8           2018-09-01       4
    9           2018-10-01       5
    10          2018-11-01       5
    11          2018-12-01       5
    12          2019-01-01       5
    13          2019-02-01       6
    14          2019-03-01       7
    15          2019-04-01       8
    ​
    
        2
  •  1
  •   Quang Hoang    7 年前

    尝试:

    old_date = '01-01-1970'
    future_date = '01-01-2050'
    cuts = pd.to_datetime([old_date, '01-04-2018', '04-05-2018', '05-31-2018',
                    '08-02-2018', '09-27-2018', '01-03-2019',
                    '02-14-2019', '03-28-2019', future_date])
    
    df = pd.DataFrame({'date': pd.date_range('01-01-2018', '04-05-2019', freq='MS')})
    df['ped'] = pd.cut(df['date'], bins=cuts).cat.codes
    

    输出:

    +----+---------------------+-------+
    |    | date                |   ped |
    |----+---------------------+-------|
    |  0 | 2018-01-01 00:00:00 |     0 |
    |  1 | 2018-02-01 00:00:00 |     1 |
    |  2 | 2018-03-01 00:00:00 |     1 |
    |  3 | 2018-04-01 00:00:00 |     1 |
    |  4 | 2018-05-01 00:00:00 |     2 |
    |  5 | 2018-06-01 00:00:00 |     3 |
    |  6 | 2018-07-01 00:00:00 |     3 |
    |  7 | 2018-08-01 00:00:00 |     3 |
    |  8 | 2018-09-01 00:00:00 |     4 |
    |  9 | 2018-10-01 00:00:00 |     5 |
    | 10 | 2018-11-01 00:00:00 |     5 |
    | 11 | 2018-12-01 00:00:00 |     5 |
    | 12 | 2019-01-01 00:00:00 |     5 |
    | 13 | 2019-02-01 00:00:00 |     6 |
    | 14 | 2019-03-01 00:00:00 |     7 |
    | 15 | 2019-04-01 00:00:00 |     8 |
    +----+---------------------+-------+
    

    编辑:结束日期有问题,即。 2019-03-28 在这段代码中给出7而不是 8 在你的代码中。这可以通过将阈值降低1天来解决。

    推荐文章