【问题标题】:Read csv with dd.mm.yyyy in Python and Pandas在 Python 和 Pandas 中使用 dd.mm.yyyy 读取 csv
【发布时间】:2015-08-30 05:43:06
【问题描述】:

我正在阅读具有德国日期格式的 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]

这会导致:

因此,不能识别带有日期的列。 我在这里做错了什么? 还是这种日期格式根本不兼容?

  • OSX 10.10.3
  • Anaconda conda 3.13.0
  • Python 3.4.3-0
  • iPython 笔记本 3.1.0

【问题讨论】:

    标签: python csv pandas date-parsing


    【解决方案1】:

    也许这会有所帮助

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

    【讨论】:

      【解决方案2】:

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

      pandas.read_csv

      【讨论】:

      • date_parser=lambda x: datetime.strptime(x, '%d.%m.%Y %H:%M:%S') 就我而言。
      【解决方案3】:

      如果您使用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 格式的日期字符串,因此您不必在此处声明自定义日期解析器。

      【讨论】:

        猜你喜欢
        • 2018-08-04
        • 2021-12-08
        • 1970-01-01
        • 2021-12-06
        • 1970-01-01
        • 2017-06-04
        • 1970-01-01
        • 2021-06-05
        • 2021-10-31
        相关资源
        最近更新 更多