Arhn - архитектура программирования

dask dataframe как преобразовать столбец в to_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

Что именно я должен поставить под мета? я должен поместить словарь ВСЕХ столбцов в df или только столбца 'time'? а какой типа ставить? Я пробовал 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% на фрейме данных 2 ГБ.

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)

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

20.09.2016

  • какая у вас версия dask? 21.09.2016
  • MRocklin, вы были правы, я обновился до версии 0.11, и теперь у меня нет проблем с ключевым словом meta. Тем не менее, он делает 1 и 2% менее чем за 30 секунд, но застрял там на час. Какие-либо предложения? 21.09.2016
  • Я думаю, что я частично решил это, используя определение функции для анализа дат и ее применение с использованием разделов карты. 22.09.2016
  • По нашему опыту, использование ключевого слова format всегда приводит к повышению производительности. 11.05.2019

Ответы:


1

Используйте 1_

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

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

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

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

При использовании методов черного ящика, таких как map_partitions, dask.dataframe должен знать тип и имена вывода. Есть несколько способов сделать это, перечисленных в строке документации для map_partitions.

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

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

Или вы можете предоставить кортеж (name, dtype) для Series или dict для DataFrame

meta = ('time', pd.Timestamp)

Тогда все должно быть хорошо

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

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

20.09.2016
  • Спасибо, MRocklin! пожалуйста, смотрите мои обновления в вопросе 21.09.2016
  • у меня больше не работает с пандами 0.20, получаю dtype <class 'pandas._lib.tslib.Timestamp'> not understood. Однако работает с meta = ('time', np.datetime64) 31.05.2017
  • Это сработало для меня без предупреждения для будущего устаревания с meta = ('time', 'datetime64[ns]') 19.07.2017
  • Вот ссылка на numpy datetime документацию. 13.05.2019

  • 2

    Dask также поставляется с to_timedelta, так что это тоже должно работать.

    df['time']=dd.to_datetime(df.time,unit='ns')
    

    Единица значений такая же, как у pd.to_timedelta в пандах. Его можно найти здесь.

    16.04.2019

    3

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

    df['time'] = df['time'].map(lambda x: pd.to_datetime(x, errors='coerce'))
    
    28.01.2018
  • Работает, но отображение лямбда-выражений плохо сказывается на производительности. 04.11.2020

  • 4

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

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

    02.10.2018
  • что, если месяц в следующем формате: 'ЯНВАРЬ' (примечание в верхнем регистре) 10.07.2019

  • 5

    Если дата и время находятся в формате, отличном от ISO, то map_partition дает лучшие результаты:

    import dask
    import pandas as pd
    from dask.distributed import Client
    client = Client()
    
    ddf = dask.datasets.timeseries()
    ddf = ddf.assign(datetime=ddf.index.astype(object))
    ddf = (ddf.assign(datetime_nonISO = ddf['datetime'].astype(str).str.split(' ')
                                     .apply(lambda x: x[1]+' '+x[0], meta=('object'))) 
    
    %%timeit
    ddf.datetime = ddf.datetime.astype('M8[s]')
    ddf.compute()
    

    11,3 с ± 719 мс на цикл (среднее ± стандартное отклонение из 7 прогонов, по 1 циклу в каждом)

    ddf = dask.datasets.timeseries()
    ddf = ddf.assign(datetime=ddf.index.astype(object))
    ddf = (ddf.assign(datetime_nonISO = ddf['datetime'].astype(str).str.split(' ')
                                     .apply(lambda x: x[1]+' '+x[0], meta=('object'))) 
    
    
    %%timeit
    ddf.datetime_nonISO = (ddf.datetime_nonISO.map_partitions(pd.to_datetime
                           ,  format='%H:%M:%S %Y-%m-%d', meta=('datetime64[s]')))
    ddf.compute()
    

    8,78 с ± 599 мс на цикл (среднее ± стандартное отклонение из 7 прогонов, по 1 циклу)

    ddf = dask.datasets.timeseries()
    ddf = ddf.assign(datetime=ddf.index.astype(object))
    ddf = (ddf.assign(datetime_nonISO = ddf['datetime'].astype(str).str.split(' ')
                                     .apply(lambda x: x[1]+' '+x[0], meta=('object'))) 
    
    %%timeit
    ddf.datetime_nonISO = ddf.datetime_nonISO.astype('M8[s]')
    ddf.compute()
    

    1 мин 8 с ± 3,65 с на цикл (среднее ± стандартное отклонение из 7 прогонов, по 1 петле в каждом)

    13.05.2019
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..