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)