dask dataframe как преобразовать столбец в datetime

Я пытаюсь преобразовать один столбец моего фрейма данных в datetime. После обсуждения здесь https://github.com/dask/dask/issues/863 я попробовал следующий код:

import dask.dataframe as dd
df['time'].map_partitions(pd.to_datetime, columns='time').compute()

, но я получаю следующее сообщение об ошибке

ValueError: Metadata inference failed, please provide `meta` keyword

что именно я должен поместить под meta? должен ли я поместить словарь всех столбцов в df или только столбца "время"? и какой тип я должен поставить? Я пробовал dtype и datetime64, но ни один из них не работает так далеко.

спасибо, и я ценю Ваши советы,

обновление

я включу здесь новые сообщения об ошибках:

1) С Помощью Метки

df['trd_exctn_dt'].map_partitions(pd.Timestamp).compute()

TypeError: Cannot convert input to Timestamp

2) Использование datetime и meta

meta = ('time', pd.Timestamp)
df['time'].map_partitions(pd.to_datetime,meta=meta).compute()
TypeError: to_datetime() got an unexpected keyword argument 'meta'

3) просто используя время даты: застревает на 2%

    In [14]: df['trd_exctn_dt'].map_partitions(pd.to_datetime).compute()
[                                        ] | 2% Completed |  2min 20.3s

кроме того, я хотел бы иметь возможность указать формат в дате, как я бы сделал в панд:

pd.to_datetime(df['time'], format = '%m%d%Y'

обновление 2

после обновления до Dask 0.11 у меня больше нет проблем с ключевым словом meta. Тем не менее, я не могу получить его за 2% на фрейме данных 2GB.

df['trd_exctn_dt'].map_partitions(pd.to_datetime, meta=meta).compute()
    [                                        ] | 2% Completed |  30min 45.7s

обновление 3

работал лучше таким образом:

def parse_dates(df):
  return pd.to_datetime(df['time'], format = '%m/%d/%Y')

df.map_partitions(parse_dates, meta=meta)

Я не уверен, что это правильный подход или нет

3 ответов


использовать astype

можно использовать astype метод преобразования dtype серии в numpy dtype

df.time.astype('M8[us]')

вероятно, есть способ указать dtype стиля Pandas (добро пожаловать на редактирование)

используйте map_partitions и meta

при использовании методов черного ящика, таких как map_partitions, ДАСК.dataframe должен знать тип и имена выходных данных. Есть несколько способов сделать это, перечисленных в docstring для map_partitions.

вы можете предоставить пустой объект Pandas с правильным dtype и name

meta = pd.Series([], name='time', dtype=pd.Timestamp)

или вы можете предоставить кортеж (name, dtype) для серии или дикт для фрейма данных

meta = ('time', pd.Timestamp)

тогда все должно быть нормально

df.time.map_partitions(pd.to_datetime, meta=meta)

если бы вы звонили map_partitions on df вместо этого вам нужно будет предоставить dtypes для всего. Однако в вашем примере это не так.


Я не уверен, что это правильный подход, но отображение столбца работало для меня:

df['time'] = df['time'].map(lambda x: pd.to_datetime(x, errors='coerce'))

это сработало для меня

ddf["Date"] = ddf["Date"].map_partitions(pd.to_datetime,format='%d/%m/%Y',meta = ('datetime64[ns]'))