用pandas读取丢失日期的最安全的方法read_csv - 给定的空白空间变成今天的日期错误

Che*_*zer 3 python pandas

py2.7 pandas version .13

读取csv并将列转换为日期的最安全的方法是什么.我注意到在我的情况下,日期列中的空格被转换为今天的日期.为什么?

这是我的csv数据

fake_file = StringIO.StringIO("""case,opdate,
7,10/18/2006,
7,10/18/2008,
621, ,""")
Run Code Online (Sandbox Code Playgroud)

这是我的代码

df=pd.DataFrame(pd.read_csv('path.csv',parse_dates=['opdate']))
Run Code Online (Sandbox Code Playgroud)

用今天的日期悲惨填满白色空间!

df=pd.DataFrame(pd.read_csv('path.csv',parse_dates=['opdate'],na_values=' '))
Run Code Online (Sandbox Code Playgroud)

工作,但我真的必须知道它总是'',而不是说''或'null'.

转换日期和保留空值最安全的方法是什么(特别是当null不是一致的值时)?

And*_*den 6

一种方法是将不同的日期解析器传递给read_csv(我也抛出了一个null):

fake_file = StringIO.StringIO("""case,opdate,
7,null,
7,10/18/2008,
621, ,""")

In [11]: parser = lambda x: pd.to_datetime(x, format='%m/%d/%Y', coerce=True)

In [12]: pd.read_csv(fake_file, parse_dates=['opdate'], date_parser=parser)
Out[12]:
   case     opdate  Unnamed: 2
0     7        NaT         NaN
1     7 2008-10-18         NaN
2   621        NaT         NaN

[3 rows x 3 columns]
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用to_datetime在事后转换为日期:

In [21]: df = pd.read_csv(fake_file)

In [22]: pd.to_datetime(df.opdate, format='%m/%d/%Y')
ValueError: time data 'null' does not match format '%m/%d/%Y'

In [23]: pd.to_datetime(df.opdate, format='%m/%d/%Y', coerce=True)
Out[23]:
0          NaT
1   2008-10-18
2          NaT
Name: opdate, dtype: datetime64[ns]

In [24]: df['opdate'] = pd.to_datetime(df.opdate, format='%m/%d/%Y', coerce=True)
Run Code Online (Sandbox Code Playgroud)

我认为,事实上,这两个to_datetimeread_csv转换空白/空格今天的日期是绝对错误 ......