У меня есть 3 numpy массива произвольного размера и типа, как указано:
время (datetime), lats (float64), longs (float64)
import numpy as np
import pandas as pd
time = np.asarray(['2018-05-01T00:30:00.000000000','2018-05-01T01:30:00.000000000','2018-05-01T02:30:00.000000000', '2018-05-01T03:30:00.000000000'], dtype='<M8[ns]')
lats = np.asarray([-90. , -89.5, -89. , -88.5, -88. , -87.5, -87. , -86.5, -86. ,-85.5])
longs = np.asarray([-180., -179.3, -178.7 , -178.1, -177.5 , -176.8, -176.2 , -175.6, -175., -174.3, -173.7 , -173.1 ,-172.5 , -171.8, -171.2 , -170.6, -170., -169.3])
И 1 массив, который содержит значения, которые соответствуют сплющенной и упорядоченной перестановке трех массивов, давая ей длину:
length = len(time)*len(lats)*len(longs)
values = np.asarray(range(length), dtype='float64')
Здесь значения произвольны, но индекс важен. Я пытаюсь построить сплющенный набор данных, который хранит все данные, упорядоченные по времени, латам, длинным - в этом порядке, так как для каждого лата должны быть значения len (longs). Ниже мой рабочий код:
master = pd.DataFrame(np.array(np.meshgrid(time, longs, lats)).T.reshape(-1,3), columns = ['datetime', 'long', 'lat'])
master['values'] = values
print master.head()
Хотя это работает нормально, мне нужно преобразовать столбец datetime в метку времени:
master['datetime'] = master['datetime'].apply(pd.to_datetime)
print master
Этот процесс изменения данных, их сглаживание, а затем преобразование между типами происходит слишком медленно и происходит с высокой вычислительной нагрузкой. Есть ли более эффективный метод для достижения желаемой структуры данных?
Вы можете избежать многих операций с низким уровнем шума при использовании MultiIndex.from_product, и это имеет то преимущество, что вы не потеряете информацию о типе. Это обходит очень медленный вызов pd.to_datetime. Например:
time = pd.date_range("2018-05-01", freq="30min", periods=24).values
lats = np.linspace(-90, -80, 1000)
longs = np.linspace(-180, -170, 1000)
length = len(time)*len(lats)*len(longs)
values = np.arange(length, dtype='float64')
который дает длину 24 М, а затем:
а потом
In [48]: %time df = pd.Series(values,
index=pd.MultiIndex.from_product([time, lats, longs],
names=["datetime", "lat", "long"])).reset_index(name='values')
Wall time: 1.38 s
In [49]: df.head()
Out[49]:
datetime lat long values
0 2018-05-01 -90.0 -180.00000 0.0
1 2018-05-01 -90.0 -179.98999 1.0
2 2018-05-01 -90.0 -179.97998 2.0
3 2018-05-01 -90.0 -179.96997 3.0
4 2018-05-01 -90.0 -179.95996 4.0