Дати часу в пандах read_csv


126

Я читаю у файлі csv з кількома колонками дати. Мені потрібно встановити типи даних після читання у файлі, але часові дати видаються проблемою. Наприклад:

headers = ['col1', 'col2', 'col3', 'col4']
dtypes = ['datetime', 'datetime', 'str', 'float']
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

Коли запуск видає помилку:

TypeError: тип даних "datetime" не зрозумілий

Перетворення стовпців після факту через pandas.to_datetime () - це не варіант, я не можу знати, які стовпці будуть об’єктами datetime. Ця інформація може змінюватися і надходити з того, що інформує мій список типових даних.

Крім того, я намагався завантажити файл csv numpy.genfromtxt, встановив dtypes у цій функції, а потім перетворив на pandas.dataframe, але він збирає дані. Будь-яка допомога дуже вдячна!

Відповіді:


272

Чому це не працює

Для read_csv не може бути встановлений тип дати, оскільки файли CSV можуть містити лише рядки, цілі числа та поплавці.

Якщо встановити dtype для datetime, панди змусять інтерпретувати дату як об’єкт, тобто ви закінчите рядок.

Пандас спосіб вирішення цього питання

pandas.read_csv()Функція має ключове слово аргумент з ім'ямparse_dates

Використовуючи це, ви можете на ходу перетворювати рядки, плаваючі чи цілі числа у datetimes, використовуючи default date_parser( dateutil.parser.parser)

headers = ['col1', 'col2', 'col3', 'col4']
dtypes = {'col1': 'str', 'col2': 'str', 'col3': 'str', 'col4': 'float'}
parse_dates = ['col1', 'col2']
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes, parse_dates=parse_dates)

Це призведе до зчитування панди col1і col2як рядки, якими вони, швидше за все, є ("2016-05-05" тощо), і після того, як прочитав рядок, date_parser для кожного стовпця буде діяти на цей рядок і повертає назад те, що повертається ця функція .

Визначення власної функції аналізу часу:

pandas.read_csv()функція також є аргумент ключового слова, який називаєтьсяdate_parser

Якщо встановити цю функцію лямбда, ця функція буде використана для розбору дат.

ПОПЕРЕДЖЕННЯ ГОТЧА

Ви повинні надати йому функцію, а не виконання функції, таким чином це правильно

date_parser = pd.datetools.to_datetime

Це неправильно :

date_parser = pd.datetools.to_datetime()

Панди 0,22 оновлення

pd.datetools.to_datetime було переселено в date_parser = pd.to_datetime

Дякую @stackoverYC


1
@Drake Я думаю, що user3221055 ніколи не повертався на сайт. У цьому проблема. Профіль говорить "Востаннє бачив 20 травня 14 травня о 2:35"
firelynx

2
Це повільне рішення. Дивіться замість цього: stackoverflow.com/questions/29882573 / ...
user1761806

@ user1761806 Добре знайдіть! Я все-таки зробив кращу. stackoverflow.com/a/46183514/3730397
firelynx

2
На пандах 0,22,0 сказано pandas.core.datetools.to_datetime, що застаріло, pd.datetools.to_datetimeзамість цього використовуйте . ось так:date_parser = pd.to_datetime
stackoverYC

1
Також є convertersпараметр, де можна вказати, у яких стовпцях є які перетворювачі. parse_dates є корисним та обробляє погані дані, але повільніше завдяки цьому тестує і виводить
Давос

31

Існує parse_datesпараметр, за допомогою read_csvякого ви можете визначити назви стовпців, які потрібно розглядати як дати чи дати:

date_cols = ['col1', 'col2']
pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=date_cols)

У мене була помилка під час передачі одного рядкового імені стовпця, тепер я розумію, що мені також потрібно було передавати список для одного значення.
TapanHP

15

Ви можете спробувати передавати фактичні типи замість рядків.

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime, datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

Але діагностувати це буде дуже важко без будь-яких ваших даних.

І дійсно, ви, мабуть, хочете, щоб панди проаналізували дати в TimeStamps, так що це може бути:

pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=True)

7

Я спробував використовувати параметр dtypes = [datetime, ...], але

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime, datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

У мене виникла така помилка:

TypeError: data type not understood

Єдина зміна, яку я повинен був внести, - це замінити datetime на datetime.datetime

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime.datetime, datetime.datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

3
Це все ще зробить тип отриманого фрейму даних об'єктом, а не pandas.datetime
firelynx

11
Крім того, що це не дає бажаного ефекту, воно також не працює: AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
Габріель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.