使用Python和Pandas读取带有dd.mm.yyyy格式的csv文件

13

我正在阅读一个带有德国日期格式的csv文件。看起来在这篇文章中它运行正常:

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 conda 3.13.0
  • Python 3.4.3-0
  • iPython notebook 3.1.0
3个回答

23
如果你使用parse_dates=True,那么read_csv会尝试解析索引为日期。 因此,你还需要使用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格式的日期字符串,因此您不必在此处声明自定义日期解析器。


3

也许这会有所帮助

from datetime import datetime as dt

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

3
使用read_csv的date_parser参数来传递自定义日期解析函数(一个使用相关日期格式包装strptime的lambda函数)。

pandas.read_csv


1
date_parser=lambda x: datetime.strptime(x, '%d.%m.%Y %H:%M:%S') 这是我的情况。 - Philipp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接