2015-06-14 2 views
5

Я читаю файл csv с немецким форматом даты. Похоже, он работал нормально в этом посте:Прочтите csv с dd.mm.yyyy в Python и Pandas

Picking dates from an imported CSV with pandas/python

Однако, похоже, в моем случае дата не признается таковым. В тестовом файле я не нашел неправильной строки.

import pandas as pd 
import numpy as np 


%matplotlib inline 
import matplotlib.pyplot as plt 

from matplotlib import style 
from pandas import DataFrame 

style.use('ggplot') 

df = pd.read_csv('testdata.csv', dayfirst=True, parse_dates=True) 
df[:5] 

table

Это приводит к:

screenshot

Таким образом, колонна с датами не признаются таковыми. Что я здесь делаю неправильно? Или этот формат даты просто не совместим?

  • OSX 10.10.3
  • Anaconda Конда 3.13.0
  • Python 3.4.3-0
  • IPython ноутбук 3.1.0

ответ

8

Если вы используете parse_dates=True затем read_csv пытается parse the index as a date. Таким образом, вы также должны объявить первый столбец как индекс с index_col=[0]:

In [216]: pd.read_csv('testdata.csv', dayfirst=True, parse_dates=True, index_col=[0]) 
Out[216]: 
      morgens mittags abends 
Datum        
2015-03-16  382  452  202 
2015-03-17  288  467  192 

В качестве альтернативы, если вы не хотите, Datum столбца такого индекса, вы могли бы использовать parse_dates=[0] явно указать read_csv разобрать первый столбец в качестве даты:

In [217]: pd.read_csv('testdata.csv', dayfirst=True, parse_dates=[0]) 
Out[217]: 
     Datum morgens mittags abends 
0 2015-03-16  382  452  202 
1 2015-03-17  288  467  192 

Под капотом read_csv использует dateutil.parser.parse разобрать дату строки:

In [218]: import dateutil.parser as DP 

In [221]: DP.parse('16.03.2015', dayfirst=True) 
Out[221]: datetime.datetime(2015, 3, 16, 0, 0) 

Поскольку dateutil.parser не имеет никаких проблем при разборе строки даты в формате DD.MM.YYYY, вы не должны объявить дату пользовательского парсер здесь.

1

Может быть, это поможет

from datetime import datetime as dt 
    dtm = lambda x: dt.strptime(str(x), "%d.%m.%Y") 
    df["Datum"] = df["Datum"].apply(dtm) 
2

использовать параметр date_parser для чтения_csv для передачи пользовательской функции синтаксического анализа даты (al. ambda, что обертывания strptime с соответствующим форматом даты)

pandas.read_csv

Смежные вопросы