Мне интересно, зачем вам нужно дублировать столбец time
до time_index
, в любом случае вот пример
Создать df
import numpy as np
import pandas as pd
import dask.dataframe as dd
N = int(1e7)
times = pd.date_range(start="2019-01-01", periods=N, freq="1s")
df = pd.DataFrame({"time":times,
"value":np.random.randn(N)})
df.to_csv("df.csv", index=False)
df.to_parquet("df.parq")
Установить индекс в пандах
%%time
df = pd.read_csv("df.csv", parse_dates=['time'])
df = df.set_index("time")
df = dd.from_pandas(df, npartitions=100)
a = df.divisions
CPU times: user 10.7 s, sys: 503 ms, total: 11.2 s
Wall time: 9.81 s
Установить индекс в dask
time
df = pd.read_csv("df.csv", parse_dates=['time'])
df = dd.from_pandas(df, npartitions=100)
df = df.set_index("time", sorted=True)
b = df.divisions
CPU times: user 11.3 s, sys: 534 ms, total: 11.8 s
Wall time: 10.4 s
Деления одинаковы
print(a==b)
True
Читать с dask
Здесь мы можем использовать infer_division и использоватьtime
как индекс, пока мы читаем из parquet
.
%%time
df = dd.read_parquet("df.parq", index="time", infer_divisions=True)
df = df.repartition(npartitions=100)
c = df.divisions
CPU times: user 9.54 ms, sys: 22 µs, total: 9.56 ms
Wall time: 8.9 ms
В этом случае деление не совпадает
print(c==a)
False
Но это не должно бытьбольшое дело
print(c[:2])
(Timestamp('2019-01-01 00:00:00'),
Timestamp('2019-01-02 03:46:39.990000128'))
Выводы
Я бы посоветовал вам читать прямо с паркетом.Ваш файл будет меньше, и вам не нужно указывать типы данных
!ls -lh df.*
-rw-rw-r-- 1 username username 378M Jun 5 14:59 df.csv
-rw-rw-r-- 1 username username 164M Jun 5 14:59 df.parq