从大型 CSV 中分块重新采样时间序列而不拆分间隔

Resample timeseries in chunks from large CSV without splitting intervals

我正在阅读带有时间序列的大型 CSV。我每秒都有值,想重新采样,例如以 15 分钟间隔的最大值和平均值。我将 pandas.read_csv() 与块一起使用。现在的问题是,该块可能会在 15 分钟间隔的中间结束,所以如果我 运行 它第一个块可能会在一个间隔内结束,例如12:00:00 并且第二个块可能以 12:00:00.

处的间隔开始

在最后 15 分钟的时间间隔内从第一个块拆分 DataFrame 并将该数据转移到下一个块的快速解决方案是什么?

import pandas as pd

source_file = './timeseries.csv'
chunksize = 10 ** 6

for chunk in pd.read_csv(
        source_file, 
        chunksize=chunksize, 
        delimiter=';',
        decimal=',',
        na_values='.',
        index_col=0, 
        parse_dates=[0,]):

    closed_15min_chunk = ???

    usable_chunk = pd.concat([buffered_chunk, closed15_min_chunk])

    buffered_chunk = ???

    avg_chunk = usable_chunk.resample('15min').mean().round(2)
    max_chunk = usable_chunk.resample('15min').max().round(2)

    print(avg_chunk)

我想找到答案了!随意 post 一个更好的答案。在下面的示例中,为了更好的可读性,我只使用平均块。

import pandas as pd

source_file = './timeseries.csv'
chunksize = 10 ** 6

buffer_chunk = None

for chunk in pd.read_csv(
        source_file, 
        chunksize=chunksize, 
        delimiter=';',
        decimal=',',
        na_values='.',
        index_col=0, 
        parse_dates=[0,]):

    if buffer_chunk is not None:
        print(f"Loaded Chunk start: {chunk.iloc[0].name}")
        chunk = pd.concat([buffer_chunk, chunk])
        print(f"Buffered chunk: {buffer_chunk.iloc[0].name} - {buffer_chunk.iloc[-1].name}")
        print(f"Chunk: {chunk.iloc[0].name} - {chunk.iloc[-1].name}")

    avg_chunk = chunk.resample('15min').mean().round(2)
    print(f"Last resampled {avg_chunk.iloc[-1].name}")

    idx = 1
    while chunk.iloc[-idx].name > avg_chunk.iloc[-1].name:
        idx += 1
    print(f"Cutoff: {chunk.iloc[-idx].name}")
    avg_chunk.drop(index=avg_chunk.index[-1], 
                   axis=0, 
                   inplace=True)
    print(f"Last resampled {avg_chunk.iloc[-1].name}")
    buffer_chunk = chunk.iloc[-idx:]