Сегодня я был приятно удивлен тем фактом, что при чтении данных из файла данных (например) панды могут распознавать типы значений:
df = pandas.read_csv('test.dat', delimiter=r"\s+", names=['col1','col2','col3'])
Например, это можно проверить следующим образом:
for i, r in df.iterrows():
print type(r['col1']), type(r['col2']), type(r['col3'])
В частности, целое число, числа с плавающей точкой и строки были распознаны правильно. Тем не менее, у меня есть столбец , который имеет даты в следующем формате: 2013-6-4
. Эти даты были распознаны как строки (не как объекты даты Python). Есть ли способ «выучить» панд к признанным датам?
df.iterrows()
и просматривать их для каждой отдельной строки, просто сделайтеdf.info()
один раз.Ответы:
Вы должны добавить
parse_dates=True
, илиparse_dates=['column name']
при чтении, этого обычно достаточно для магического анализа. Но всегда есть странные форматы, которые нужно определять вручную. В таком случае вы также можете добавить функцию синтаксического анализа даты, которая является наиболее гибким способом.Предположим, у вас есть столбец datetime с вашей строкой, а затем:
Таким образом, вы можете даже объединить несколько столбцов в один столбец datetime, при этом столбцы «date» и «time» объединяются в один столбец «datetime»:
Вы можете найти директивы (то есть буквы, которые будут использоваться для различных форматов) для
strptime
иstrftime
на этой странице .источник
TypeError: strptime() argument 1 must be str, not float
infer_datetime_format
: «Панды попытаются определить формат строк даты и времени в столбцах». Это можно использовать вместоdate_parser
.ISO 8601
формате, вы не должны передаватьinfer_datetime_format
или функцию синтаксического анализатора - это намного медленнее, чем позволить пандам обрабатывать это (особенно последнее). Формат даты в этом ответе также попадает в эту категориюВозможно, интерфейс pandas изменился после ответа @Rutger, но в версии, которую я использую (0.15.2),
date_parser
функция получает список дат вместо одного значения. В этом случае его код должен быть обновлен так:источник
Метод read_csv для панд отлично подходит для разбора дат. Полная документация на http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html
Вы можете даже иметь разные части даты в разных столбцах и передавать параметр:
Стандартное восприятие дат прекрасно работает, но, похоже, оно смещено в сторону североамериканских форматов дат. Если вы живете в другом месте, вы можете время от времени попадаться на результаты. Насколько я помню, 1/6/2000 означает 6 января в США, а не 1 июня, где я живу. Это достаточно умно, чтобы качать их, если используются даты, такие как 23/6/2000. Вероятно, безопаснее остаться с вариациями даты ГГГГММДД. Прошу прощения у разработчиков панд, здесь, но я не проверял это с местными датами в последнее время.
Вы можете использовать параметр date_parser, чтобы передать функцию для преобразования вашего формата.
источник
dayfirst
как True для европейских / международных дат. pandas.pydata.org/pandas-docs/stable/generated/…Вы можете использовать
pandas.to_datetime()
в соответствии с рекомендациями в документации дляpandas.read_csv()
:Демо-версия:
источник
При объединении двух столбцов в один столбец datetime принятый ответ генерирует ошибку (pandas версия 0.20.3), поскольку столбцы отправляются в функцию date_parser отдельно.
Следующие работы:
источник
Да - согласно
pandas.read_csv
документации :Так что, если у вашего csv есть столбец с именем,
datetime
а даты выглядят,2013-01-01T01:01
например, как при запуске, это заставит панд (я на v0.19.2) автоматически выбрать дату и время:df = pd.read_csv('test.csv', parse_dates=['datetime'])
Обратите внимание, что вам нужно явно передать
parse_dates
, он не работает без.Проверьте с помощью:
df.dtypes
Вы должны увидеть тип данных столбца
datetime64[ns]
источник
Если производительность имеет значение для вас, убедитесь, что вы время:
печатает:
Так что с датой в формате iso8601 (
%Y-%m-%d %H:%M:%S
очевидно, это дата в формате iso8601, я думаю, T можно отбрасывать и заменять пробелом), вы не должны указыватьinfer_datetime_format
(что, по-видимому, не имеет значения для более распространенных) и передавать свою собственную парсер просто калечит производительность. С другой стороны,date_parser
имеет значение не столь стандартные дневные форматы. Будьте уверены, что время, прежде чем оптимизировать, как обычно.источник
Во время загрузки CSV-файла содержит столбец даты. У нас есть два подхода, чтобы сделать панды для распознавания столбца даты, т.е.
Панды явно распознают формат по аргументу
date_parser=mydateparser
Панды неявно распознают формат по agr
infer_datetime_format=True
Некоторые данные столбца даты
01/01/18
01/02/18
Здесь мы не знаем первые две вещи. Это может быть месяц или день. Так что в этом случае мы должны использовать метод 1: - Явный передать формат
Способ 2: - Неявный или автоматически распознавать формат
источник