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_csv,na_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...
to_datetime与format和一起使用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)
问题是您的自定义日期解析器 - 它无法处理 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)