间隔变化粒度的性能

问题描述 投票:0回答:1

在 Pandas 上工作我有一个步骤的性能问题。 它正在处理少量数据,但我无法在合理的时间内得到大量数据的答案。

我有一个这样的数据框:

ColA ColB ColC start      end
1    1    1    2020-01-01 2021-01-01

有 715K 行像这行和你看到的 5 列,每一行的日期都不同

我想将数据框的粒度更改为具有间隔中有日期的行

像这样的东西:

ColA ColB ColC Date
1    1    1    2020-01-01
1    1    1    2020-01-02
[...]
1    1    1    2020-12-31
1    1    1    2021-01-01

我估计时间间隔平均由 100 个日期组成,我最后应该有大约 71.5M 行

我试过这个:

df2= p.DataFrame(columns=['ColA','ColB', 'ColC','DATE'])
for index, row in df1.iterrows():
        ColA = row['ColA']
        ColB = row['ColB']
        ColC = row['ColC']
        start_date = p.to_datetime(row['start'])
        end_date = p.to_datetime(row['end'])   
        delta = end_date - start_date  
        for i in range(delta.days + 1):
            day = start_date + timedelta(days=i)
            new_row = {'ColA': CoLA, 'ColB': ColB, 'ColC':ColC, 'DATE':day}
            df2= df2.append(new_row, ignore_index=True)

但是它已经运行了几个小时没有结果:(

你知道我怎样才能做得更好吗? 谢谢解答

python pandas date intervals
1个回答
0
投票

尝试先创建整个列,然后展开:

df['Date'] = df.apply(lambda x: pd.date_range(x['start'], x['end'], freq='D').tolist(), axis=1)

df.drop(columns=['start','end']).explode('Date')

输出:

    ColA  ColB  ColC       Date
0      1     1     1 2020-01-01
0      1     1     1 2020-01-02
0      1     1     1 2020-01-03
0      1     1     1 2020-01-04
0      1     1     1 2020-01-05
..   ...   ...   ...        ...
0      1     1     1 2020-12-28
0      1     1     1 2020-12-29
0      1     1     1 2020-12-30
0      1     1     1 2020-12-31
0      1     1     1 2021-01-01

注意 由于原始大小和日期范围,您的数据相对较大。这会快一点,但第一个操作(创建

Date
)仍然很慢。

© www.soinside.com 2019 - 2024. All rights reserved.