datetime dtypes в пандах read_csv

128

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

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, но он искажает данные. Любая помощь приветствуется!

user3221055
источник

Ответы:

274

Почему не работает

Для read_csv не нужно устанавливать datetime dtype, поскольку файлы csv могут содержать только строки, целые числа и числа с плавающей запятой.

Установка dtype на datetime заставит pandas интерпретировать datetime как объект, что означает, что вы получите строку.

Панды способ решения этого

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

Используя это, вы можете на лету конвертировать строки, числа с плавающей запятой или целые числа в дату и время, используя 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

Если задать лямбда-функцию, эта конкретная функция будет использоваться для анализа дат.

ПРЕДУПРЕЖДЕНИЕ GOTCHA

Вы должны дать ему функцию, а не выполнение функции, поэтому это правильно

date_parser = pd.datetools.to_datetime

Это неверно :

date_parser = pd.datetools.to_datetime()

Pandas 0.22 Обновить

pd.datetools.to_datetime был переведен в date_parser = pd.to_datetime

Спасибо @stackoverYC

firelynx
источник
1
@Drake Я думаю, что user3221055 так и не вернулся на сайт. Это проблема. В профиле написано: «Последний раз видели 20 мая '14 в 2:35»
firelynx
2
Это медленное решение. См. Вместо этого: stackoverflow.com/questions/29882573/…
user1761806
@ user1761806 Привет, хорошая находка! Но я сделал лучше. stackoverflow.com/a/46183514/3730397
firelynx
2
На pandas 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которого вы можете определить имена столбцов, которые вы хотите обрабатывать как даты или datetime:

date_cols = ['col1', 'col2']
pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=date_cols)
mrjrdnthms
источник
У меня была ошибка, так как я передавал одно строковое имя столбца, теперь я понимаю, что мне также нужно передать список для одного значения.
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)

Но это будет действительно сложно диагностировать без каких-либо данных, с которыми можно было бы повозиться.

И действительно, вы, вероятно, хотите, чтобы панды анализировали даты в TimeStamp, так что это может быть:

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
Это все равно сделает dtype результирующего фрейма данных объектом, а не pandas.datetime
firelynx
11
Помимо того факта, что это не дает желаемого эффекта, это также не работает:AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
Габриэль