2017-01-10 2 views
0

Я делаю следующее, чтобы передать несколько дат в разных столбцах. Однако второй столбец столбца (времени) не соответствует этой строке, поэтому он имеет ошибки. Как мне это достичь?Pandas DataFrame/HDFStore Pass Несколько форматов даты через CSV

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

for chunk in pd.read_csv(file, chunksize=500000, parse_dates=['date','time'], parse_dates = dateparse, names = col_names, index_col = index_cols, header = 0, dtype = dtype) 
     store.append('df',chunk) 

Образец данных:

Date      Time 
19/10/2016 00:00:00  00:05:01 
+0

Вы пробовали просто оставив вне 'parse_dates = dateparse' части и указания' parse_dates = [[ 'даты', 'время']] ', который будет сочетать в себе дата и время в один столбец? – chthonicdaemon

+0

Было бы лучше, если бы вы разместили образцы данных как необработанные CSV (откройте в текстовом редакторе и скопируйте их). – chthonicdaemon

+0

У меня есть два варианта: добавьте дату в столбец 'Time' и преобразуйте ее в' datetime' или преобразуйте ее в 'timedelta64 [ns]' dtype – MaxU

ответ

2

Там нет необходимости указывать DATETIME формат, если у вас есть стандартный формат, как '19/10/2016 00:00:00' - Панды будет разбирать его автоматически, так что вам не нужно использовать date_parser параметр ,

Вариант 1: Конвертирование Time колонка datetime64[ns] DTYPE:

for chunk in pd.read_csv(file, chunksize=500000, parse_dates=['Date'], names=col_names, index_col=index_cols, dtype = dtype): 
    chunk['Time'] = chunk['Date'].dt.normalize() + pd.to_timedelta(chunk['Time']) 
    store.append('df',chunk) 

Вариант 2: Преобразование Time колонка timedelta64[ns] DTYPE:

for chunk in pd.read_csv(file, chunksize=500000, parse_dates=['Date'], names=col_names, index_col=index_cols, dtype = dtype): 
    chunk['Time'] = pd.to_timedelta(chunk['Time']) 
    store.append('df',chunk) 

PS как упоминалось dtypes поддерживаются HDFStore

Вариант 3:

for chunk in pd.read_csv(file, chunksize=500000, names=col_names, index_col=index_cols, dtype = dtype): 
    chunk['Date'] = pd.to_datetime(chunk['Date'], errors='coerce') 
    chunk['Time'] = pd.to_timedelta(chunk['Time'], errors='coerce') 
    store.append('df',chunk) 
+0

Спасибо MaxU. Причина, по которой я хотел явно проанализировать значения, состоит в том, что эти данные введены пользователем и, следовательно, подвержены ошибкам. Если я не разбираюсь в нем явно, и есть ошибка в столбцах даты/времени, это станет объектами?И затем, если я попытаюсь добавить следующий фрагмент с чистыми данными/новым CSV в тот же магазин, это снова станет проблемой. Вот почему я хотел прояснить это прямо. – CodeGeek123

+0

@ CodeGeek123, в этом вы можете пойти для «Варианта 3» (см. Обновление в ответе) – MaxU

+0

Удивительно! Спасибо! :) – CodeGeek123

1

Вы можете сказать, панды объединить даты и времени столбцов в один столбец, передавая список списков, а не просто список в parse_dates, как указано в the documentation:

parse_dates: булевы или список целых чисел или имен или списка списков или Dict, по умолчанию значение False

  • boolean. Если True -> попробуйте разобрать индекс.
  • Список целых чисел или имен. например Если [1, 2, 3] -> попытаться разобрать столбцы 1, 2, 3 каждый в качестве отдельного столбца даты.
  • список перечней. например Если [[1, 3]] -> объединить столбцы 1 и 3 и разобрать как столбец с одной датой. dict, т.е. { «Foo»: [1, 3]} -> синтаксического анализа столбцов 1, 3, как и даты вызова результата «Foo»

Вы также хотите, чтобы указать dayfirst=True учитывая ваш формат даты.

Это означает, что ваш код становится

for chunk in pd.read_csv(file, chunksize=500000, 
         parse_dates=[['date', 'time']], # note the extra [] 
         dayfirst=True, 
         names=col_names, index_col=index_cols, 
         header=0, dtype=dtype) 
    store.append('df',chunk) 
Смежные вопросы