Как читать строку как дату в python pandas [duplicate]

Если вы не можете использовать Python 2.6, вы можете использовать простое safeeval immenentation, например http://code.activestate.com/recipes/364469/

. Это контрейлеры на компиляторе Python, поэтому вам не нужно делать всю грубую работу самостоятельно.

56
задан firelynx 26 September 2016 в 09:10
поделиться

5 ответов

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

Нет значения datetime 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)

Это заставит панды читать col1 и col2 как строки, которые они наиболее вероятно («2016-05-05» и т. Д.), И после чтения строки, date_parser для каждого столбца будет действовать на эту строку и возвратить все, что возвращает эта функция.

Определение собственной функции синтаксического анализа даты:

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

Установка этой функции в lambda сделает эту конкретную функцию для анализа синтаксического анализа даты.

ПРЕДУПРЕЖДЕНИЕ 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

138
ответ дан firelynx 19 August 2018 в 14:37
поделиться

Я попытался использовать параметр 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)
6
ответ дан Jose Buraschi 19 August 2018 в 14:37
поделиться
  • 1
    Это все равно сделает dtype результирующего объекта данных объектом, а не pandas.datetime – firelynx 26 May 2016 в 07:22
  • 2
    Помимо того, что это не имеет желаемого эффекта, оно также не работает: AttributeError: type object 'datetime.datetime' has no attribute 'datetime' – Gabriel 1 December 2016 в 10:29

Теперь есть параметр parse_dates, который вы можете передать read_csv, который позволяет вам указывать имена столбцов, которые вы хотите рассматривать как даты. Итак, лучший способ для OP:

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

current read_csv documentation довольно забавно ...

1
ответ дан mrjrdnthms 19 August 2018 в 14:37
поделиться

Вы можете попробовать передать фактические типы вместо строк.

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)
10
ответ дан Paul H 19 August 2018 в 14:37
поделиться
0
ответ дан Pythoner 31 October 2018 в 02:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: