Параметр даты, когда YYYYMMDD и HH находятся в отдельных столбцах, используя pandas в Python
У меня есть простой вопрос, связанный с csv файлами и синтаксический анализ datetime.
У меня есть файл csv, который выглядит так:
YYYYMMDD, HH, X
20110101, 1, 10
20110101, 2, 20
20110101, 3, 30
Я хотел бы прочитать его с помощью pandas (read_csv) и иметь его в фрейме данных, индексированном по дате. До сих пор я пытался реализовать следующее:
import pandas as pnd
pnd.read_csv("..\\file.csv", parse_dates = True, index_col = [0,1])
и я получаю результат:
X
YYYYMMDD HH
2011-01-01 2012-07-01 10
2012-07-02 20
2012-07-03 30
Как вы видите parse_dates при преобразовании HH в другую дату.
Есть ли простой и эффективный способ правильно совместить столбец "YYYYMMDD" со столбцом "HH", чтобы иметь что-то вроде этого?
X
Datetime
2011-01-01 01:00:00 10
2011-01-01 02:00:00 20
2011-01-01 03:00:00 30
Заранее благодарим за помощь.
Ответы
Ответ 1
Если вы передаете список index_col
, это означает, что вы хотите создать иерархический индекс из столбцов в списке.
Кроме того, ключевое слово parse_dates
может быть установлено как True, так и список /dict. Если True, то он пытается проанализировать отдельные столбцы как даты, иначе он объединяет столбцы для синтаксического анализа одного столбца даты.
В общем, что вы хотите сделать:
from datetime import datetime
import pandas as pd
parse = lambda x: datetime.strptime(x, '%Y%m%d %H')
pd.read_csv("..\\file.csv", parse_dates = [['YYYYMMDD', 'HH']],
index_col = 0,
date_parser=parse)
Ответ 2
Я делаю это все время, поэтому я тестировал разные способы скорости.
Самый быстрый, который я нашел, следующий, прибл. В 3 раза быстрее, чем решение Chang She, по крайней мере в моем случае, когда учитывается общее время разбора файла и синтаксический анализ даты:
Сначала проанализируйте файл данных, используя pd.read_csv с отсутствием даты синтаксического анализа. Я нахожу, что это замедляет чтение файлов довольно много. Убедитесь, что столбцы CSV файла теперь являются столбцами в dataframe df. Тогда:
format = "%Y%m%d %H"
times = pd.to_datetime(df.YYYYMMDD + ' ' + df.HH, format=format)
df.set_index(times, inplace=True)
# and maybe for cleanup
df = df.drop(['YYYYMMDD','HH'], axis=1)