py2.7 pandas版本.13
读取csv并将列转换为日期的最安全方法是什么。我注意到,在我的情况下,日期列中的空白转换为今天的日期。为什么?
这是我的CSV数据
fake_file = StringIO.StringIO("""case,opdate,
7,10/18/2006,
7,10/18/2008,
621, ,""")
这是我的代码
df=pd.DataFrame(pd.read_csv('path.csv',parse_dates=['opdate']))
悲惨地用今天的日期填充空白!
df=pd.DataFrame(pd.read_csv('path.csv',parse_dates=['opdate'],na_values=' '))
可以,但是我真的必须知道它始终是'',而不是说'或'null'。
转换日期并保留null的最安全方法是什么(尤其是在null不是一致的值时)?
一种方法是将一个不同的日期解析器传递给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]
另一种选择是使用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)
我认为,事实上,这两个to_datetime
和read_csv
转换空白/空格今天的日期是绝对错误......
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句