从大型 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:]
我正在阅读带有时间序列的大型 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:]