столбец даты синтаксиса в csv с использованием pandas read_csv [duplicate]

80
задан Roman 4 July 2013 в 09:08
поделиться

6 ответов

При чтении вы должны добавить parse_dates=True или parse_dates=['column name'], что обычно достаточно, чтобы магически разобрать его. Но всегда есть странные форматы, которые нужно определить вручную. В этом случае вы также можете добавить функцию парсера даты, которая является наиболее гибким способом.

Предположим, что у вас есть столбец «datetime» с вашей строкой, а затем:

dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')

df = pd.read_csv(infile, parse_dates=['datetime'], date_parser=dateparse)

Таким образом, вы можете даже объединить несколько столбцов в один столбец datetime, это объединяет столбец «дата» и «время» в один столбец «datetime»:

dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')

df = pd.read_csv(infile, parse_dates={'datetime': ['date', 'time']}, date_parser=dateparse)
166
ответ дан Rutger Kassies 15 August 2018 в 23:45
поделиться
  • 1
    Не работает для меня, я получил следующую ошибку: TypeError: strptime() argument 1 must be str, not float – Jean Paul 4 May 2017 в 12:36
  • 2
    Я получил эту ошибку, потому что в моем кадре данных были nan. – Jean Paul 4 May 2017 в 13:10
  • 3
    вы можете добавить элемент, который также NaTs не подвержен анализу материала или NaN или / Ns. потому что кажется, что этот парсер полностью пропускает весь столбец, если что-то подобное присутствует – Amir 17 October 2017 в 20:31
  • 4

При объединении двух столбцов в один столбец datetime принятый ответ генерирует ошибку (pandas version 0.20.3), так как столбцы отправляются отдельно для функции date_parser.

Следующие работы:

def dateparse(d,t):
    dt = d + " " + t
    return pd.datetime.strptime(dt, '%d/%m/%Y %H:%M:%S')

df = pd.read_csv(infile, parse_dates={'datetime': ['date', 'time']}, date_parser=dateparse)
5
ответ дан DaFois 15 August 2018 в 23:45
поделиться

Вы можете использовать pandas.to_datetime() , как рекомендовано в документации для pandas.read_csv() :

Если столбец или индекс содержит непроверяемая дата, весь столбец или индекс будут возвращены без изменений как тип данных объекта. Для нестандартного синтаксиса datetime используйте pd.to_datetime после pd.read_csv.

Демо:

>>> D = {'date': '2013-6-4'}
>>> df = pd.DataFrame(D, index=[0])
>>> df
       date
0  2013-6-4
>>> df.dtypes
date    object
dtype: object
>>> df['date'] = pd.to_datetime(df.date, format='%Y-%m-%d')
>>> df
        date
0 2013-06-04
>>> df.dtypes
date    datetime64[ns]
dtype: object
3
ответ дан Eugene Yarmash 15 August 2018 в 23:45
поделиться

Да - в соответствии с документацией pandas.read_csv :

Примечание. Для дат iso8601 в формате существует быстрый путь.

Итак, если ваш csv имеет столбец с именем datetime, и даты, например, выглядят как 2013-01-01T01:01, запуск этой программы сделает pandas (я на v0.19.2) забрать дата и время автоматически:

df = pd.read_csv('test.csv', parse_dates=['datetime'])

Обратите внимание, что вам необходимо явно передать parse_dates, это не работает.

Проверить с помощью:

df.dtypes

Вы должны увидеть, что тип данных столбца datetime64[ns]

5
ответ дан Gaurav 15 August 2018 в 23:45
поделиться
  • 1
    Я думаю, вы неправильно поняли вопрос. Пользователю интересно, можно ли включить параметр для его формата строки. – Arya McCarthy 10 April 2017 в 02:51
  • 2
    @AryaMcCarthy umm, он в принципе хочет, чтобы дата была правильно распознана, поэтому я упоминаю, как он может преобразовать исходные данные, чтобы это было естественно распознано пандами. Нигде он не упоминает, что он не может изменить формат исходных данных. – Gaurav 2 September 2017 в 00:14
  • 3
    Однако это красивое и простое решение! Спасибо, что поделился! :) – Michael Dorner 1 March 2018 в 13:56

Метод pandas read_csv отлично подходит для парсинга. Полная документация на http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html

, вы можете даже иметь разные даты в разных столбцах и передать параметр:

parse_dates : boolean, list of ints or names, list of lists, or dict
If True -> try parsing the index. If [1, 2, 3] -> try parsing columns 1, 2, 3 each as a
separate date column. If [[1, 3]] -> combine columns 1 and 3 and parse as a single date
column. {‘foo’ : [1, 3]} -> parse columns 1, 3 as date and call result ‘foo’

По умолчанию чувствительность дат отлично работает, но, похоже, она предвзято относится к форматам даты в северной Америке. Если вы живете в другом месте, вы иногда можете быть пойманы результатами. Насколько я помню, 1/6/2000 означает 6 января в США, а не 1 июня, где я живу. Он достаточно умен, чтобы качать их, если используются даты, такие как 23/6/2000. Вероятно, безопаснее оставаться с вариантами даты YYYYMMDD. Извинитесь за разработчиков pandas, но я не тестировал его с локальными датами в последнее время.

вы можете использовать параметр date_parser для передачи функции для преобразования вашего формата.

date_parser : function
Function to use for converting a sequence of string columns to an array of datetime
instances. The default uses dateutil.parser.parser to do the conversion.
10
ответ дан Joop 15 August 2018 в 23:45
поделиться
  • 1
    см. вопрос был дан ответ, когда я печатал свой ответ .. удалит мой ответ за день, поскольку @Rutger более непосредственно ответит на вопрос. Хранение здесь, но так, потому что у меня были некоторые другие идеи, которые могут быть полезны – Joop 4 July 2013 в 11:50
  • 2
    Просто держи, это хороший ответ. Небольшая избыточность не наносит никакого вреда. :) – Rutger Kassies 4 July 2013 в 12:13
  • 3
    Пожалуйста, не удаляйте свой ответ. Возможно, будет полезен какой-либо другой аспект или другая формулировка (формулировка). – Roman 5 July 2013 в 12:55
  • 4
    Вы можете указать dayfirst как «Истина» для европейских / международных дат. [Д0] pandas.pydata.org/pandas-docs/stable/generated/… – Will Gordon 15 November 2017 в 11:16

Возможно, интерфейс pandas изменился с тех пор, как ответил @Rutger, но в версии, которую я использую (0.15.2), функция date_parser получает список дат вместо одного значения. В этом случае его код должен быть обновлен следующим образом:

dateparse = lambda dates: [pd.datetime.strptime(d, '%Y-%m-%d %H:%M:%S') for d in dates]

df = pd.read_csv(infile, parse_dates=['datetime'], date_parser=dateparse)
13
ответ дан Sean 15 August 2018 в 23:45
поделиться
Другие вопросы по тегам:

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