Чтение csv с dd.mm.yyyy в Python и Pandas

Я читаю файл csv с немецким форматом даты. Кажется, в этом посте все сработало:

Выбор дат из импортированного CSV с помощью 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]

таблица

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

скриншот

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

  • ОС X 10.10.3
  • Анаконда конда 3.13.0
  • Питон 3.4.3-0
  • ноутбук iPython 3.1.0

person RogerWilco77    schedule 14.06.2015    source источник


Ответы (3)


Если вы используете parse_dates=True, то read_csv попытается разобрать индекс< /em> как дату. Поэтому вам также нужно будет объявить первый столбец индексом с 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, вам не нужно объявлять здесь пользовательский анализатор даты.

person unutbu    schedule 14.06.2015

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

pandas.read_csv

person Ophir Yoktan    schedule 14.06.2015
comment
date_parser=lambda x: datetime.strptime(x, '%d.%m.%Y %H:%M:%S') Так было в моем случае. - person Philipp; 05.03.2020

Может это поможет

from datetime import datetime as dt

dtm = lambda x: dt.strptime(str(x), "%d.%m.%Y")
df["Datum"] = df["Datum"].apply(dtm)
person Aleksandr    schedule 14.06.2015