2015-06-14 12 views
5

Czytam plik csv z niemieckim formatem daty. Wydaje się jakby to działało OK w tym poście:Przeczytaj csv z dd.mm.rrrr w Pythonie i Pandach

Picking dates from an imported CSV with pandas/python

Jednak wydaje się, że w moim przypadku data nie jest rozpoznawane jako takie. Nie znaleziono nieprawidłowego ciągu w pliku testowym.

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

Skutkuje:

screenshot

Tak, kolumna z datami nie jest rozpoznawane jako takie. Co ja tu robię źle? Czy ten format daty jest po prostu niezgodny?

  • OSX 10.10.3
  • Anaconda Conda 3.13.0
  • Python 3.4.3-0
  • ipython notebook 3.1.0

Odpowiedz

8

Jeśli używasz parse_dates=True następnie read_csv próbuje parse the index as a date. Dlatego będzie trzeba także zadeklarować pierwszą kolumnę jako indeks z 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 

Ewentualnie, jeśli nie chcesz kolumnę Datum się indeks, można użyć parse_dates=[0] wyraźnie powiedzieć read_csv do analizowania pierwszą kolumnę jako terminach:

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 

Pod maską read_csv używa dateutil.parser.parse do analizowania datę Struny:

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) 

Od dateutil.parser nie ma problemów parsowania łańcuchach daty w formacie DD.MM.YYYY, nie trzeba deklarować daty niestandardowy parser tutaj.

1

Może to pomoże

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

użyj parametru data_parser pliku read_csv, aby przekazać niestandardową funkcję parsowania daty (al ambda że owija strptime z odpowiednim formacie data)

pandas.read_csv

Powiązane problemy