使用空值处理解析pandas.read_csv中的日期?

bla*_*ite 6 python null pandas

考虑以下人造CSV:

from io import StringIO

data = """value,date
7,null
7,10/18/2008
621,(null)"""

fake_file = StringIO(data)
Run Code Online (Sandbox Code Playgroud)

我想使用读取此文件pandas.read_csvna_values并使用parse_dates和处理参数的空值和日期date_parser

import pandas as pd

date_parser = lambda c: pd.datetime.strptime(c, '%m/%d/%Y')

df = pd.read_csv(fake_file, parse_dates=['date'], date_parser=date_parser, na_values=['null', '(null)'])
Run Code Online (Sandbox Code Playgroud)

在Python 3.5中运行此代码可以使我做到这一点:

  File "<ipython-input-11-aa5bcf0858b7>", line 1, in <lambda>
    date_parser = lambda c: pd.datetime.strptime(c, DATE_FMT)

TypeError: strptime() argument 1 must be str, not float
Run Code Online (Sandbox Code Playgroud)

因此,似乎先处理了null,然后尝试解析日期...

我知道我可以这样做:

df = pd.read_csv(fake_file, na_values=['null', '(null)'])
df['date'] = pd.to_datetime(df['date'], format='%m/%d/%Y')
Run Code Online (Sandbox Code Playgroud)

但是我真正的问题是如何同时处理日期格式和处理NaN...

jez*_*ael 7

to_datetimeformat和一起使用errors='coerce'

date_parser = lambda c: pd.to_datetime(c, format='%m/%d/%Y', errors='coerce')
df = pd.read_csv(fake_file, parse_dates=['date'], date_parser=date_parser)
print (df)
   value       date
0      7        NaT
1      7 2008-10-18
2    621        NaT
Run Code Online (Sandbox Code Playgroud)


a_g*_*est 5

问题是您的自定义日期解析器 - 它无法处理 s NaN。相反,您可以使用该pandas.to_datetime函数作为解析器:

from functools import partial

date_parser = partial(pd.to_datetime, format='%m/%d/%Y')
Run Code Online (Sandbox Code Playgroud)