Datetime dtypes в pandas read_csv
Я читаю файл 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: data type "datetime" not understood
Преобразование столбцов после факта через pandas.to_datetime() не является опцией, я не могу знать, какие столбцы будут представлять собой объекты datetime. Эта информация может меняться и поступать из любого, что сообщает мой список dtypes.
В качестве альтернативы я попытался загрузить файл csv с помощью numpy.genfromtxt, установить dtypes в этой функции и затем преобразовать в pandas.dataframe, но он искажает данные. Любая помощь очень ценится!
Ответы
Ответ 1
Почему это не работает
Не существует dtetime dtype для read_csv, поскольку файлы csv могут содержать только строки, целые числа и плавающие элементы.
Установка dtype в datetime сделает pandas интерпретацию datetime как объекта, то есть вы получите строку.
Pandas способ решения этого
Функция pandas.read_csv()
имеет аргумент ключевого слова parse_dates
Используя это, вы можете на лету преобразовывать строки, поплавки или целые числа в datetime, используя по умолчанию 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)
Это приведет к тому, что pandas будет читать 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()
Ответ 2
Вы можете попробовать передать фактические типы вместо строк.
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)
Но будет очень сложно диагностировать это без каких-либо ваших данных, чтобы возиться с.
И действительно, вы, вероятно, хотите, чтобы pandas анализировал даты в TimeStamps, так что может быть:
pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=True)
Ответ 3
Я попытался использовать параметр 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)