【发布时间】:2020-07-31 16:54:25
【问题描述】:
我有一个这样的 CSV 文件。该文件有大约 200 万行。
2020/03/05 14:59:12.093,92.7884,93.8238
2020/03/05 14:59:14.571,97.1114,51.3926
2020/03/05 14:59:16.035,56.1351,62.6697
2020/03/05 14:59:16.992,90.3412,64.8728
:
我想创建 pandas 数据帧,使每个数据帧有 2 分钟的跨度和 20 秒的滑动时间,如下所示。
DataFrame1:
2020/03/05 14:59:12.093,92.7884,93.8238
2020/03/05 14:59:14.571,97.1114,51.3926
2020/03/05 14:59:16.035,56.1351,62.6697
:
2020/03/05 15:01:11.652,90.6966,37.9923
2020/03/05 15:01:11.918,35.8304,1.04157
DataFrame2:
2020/03/05 14:59:33.086,85.2834,57.327
2020/03/05 14:59:34.373,94.0521,33.8809
2020/03/05 14:59:38.752,36.8084,37.9878
:
2020/03/05 15:01:33.090,70.4679,54.3437
等等。
我知道我可以用下面的代码做到这一点。
df = pd.read_csv(file_name, header=None, names=['time', 'colA', 'colB'])
df['time'] = pd.to_datetime(df['time'], format=r'%Y/%m/%d %H:%M:%S.%f')
df = df.set_index('time')
extracted_dfs = []
startdatetime = df.index[0]
enddatetime = df.index[len(df)-1]
curdatetime = startdatetime
while curdatetime < enddatetime:
extracted_df = df[curdatetime:curdatetime + pd.Timedelta(seconds=120)].copy()
extracted_dfs.append(extracted_df)
curdatetime = curdatetime + pd.Timedelta(seconds=20)
但是这段代码很慢。大约需要 30 秒。 我怎样才能更快地做到这一点?
【问题讨论】:
-
我发现了一些有趣的东西,不确定效果如何,但值得一看。 pandas.DataFrame.between_time
-
您是否需要所有数据的真实副本,或者视图就足够了?每 20 秒创建一个每个 120 秒窗口的副本意味着您要为每行创建 6 个副本,这当然是缓慢且浪费资源的。是否有必要出于其他原因,例如您要在每个 DataFrame 中以不同方式修改同一行?
-
@JohnZwinck 是的,我需要真正的副本。我将把每一行的值修改为第一行的差异。
-
几个问题:(1)您是否考虑过并行化,例如使用 Dask? (2) 回到复制与视图的问题,如何创建一个包含这些行重复的单个更大的数据框?什么就够了?
-
你试过Dask吗?