Pandas read_csv使用字符串'nan'填充空值,而不是解析日期

5 python csv date missing-data pandas

np.nan在DataFrame的列中分配缺少的值.然后使用to_csv将DataFrame写入csv文件.如果我使用文本编辑器打开文件,则生成的csv文件在缺少值的逗号之间没有任何内容.但是当我使用read_csv将csv文件读回DataFrame时,缺失的值将变为字符串'nan'而不是NaN.结果,isnull()不起作用.例如:

In [13]: df
Out[13]: 
   index  value date
0    975  25.35  nan
1    976  26.28  nan
2    977  26.24  nan
3    978  25.76  nan
4    979  26.08  nan

In [14]: df.date.isnull()
Out[14]: 
0    False
1    False
2    False
3    False
4    False
Run Code Online (Sandbox Code Playgroud)

我做错了吗?我应该分配一些其他值而不是np.nan缺少值,以便isnull()能够获取吗?

编辑:对不起,忘了提到我还设置了parse_dates = [2]来解析该列.该列包含缺少某些行的日期.我想要缺少的行NaN.

EIDT:我刚刚发现问题实际上是由于parse_dates.如果日期列包含缺失值,则read_csv将不会解析该列.相反,它会将日期读作字符串,并将字符串'nan'分配给空值.

In [21]: data = pd.read_csv('test.csv', parse_dates = [1])

In [22]: data
Out[22]: 
   value      date id
0      2  2013-3-1  a
1      3  2013-3-1  b
2      4  2013-3-1  c
3      5       nan  d
4      6  2013-3-1  d

In [23]: data.date[3]
Out[23]: 'nan'
Run Code Online (Sandbox Code Playgroud)

pd.to_datetime也不起作用:

In [12]: data
Out[12]: 
   value      date id
0      2  2013-3-1  a
1      3  2013-3-1  b
2      4  2013-3-1  c
3      5       nan  d
4      6  2013-3-1  d

In [13]: data.dtypes
Out[13]: 
value     int64
date     object
id       object

In [14]: pd.to_datetime(data['date'])
Out[14]: 
0    2013-3-1
1    2013-3-1
2    2013-3-1
3         nan
4    2013-3-1
Name: date
Run Code Online (Sandbox Code Playgroud)

有没有办法让read_csv parse_dates处理包含缺失值的列?即将NaN分配给缺失值并仍然解析有效日期?

Jef*_*eff 7

这是目前解析器中的一个小问题,请参阅:https://github.com/pydata/pandas/issues/3062 简单的解决方法是在读取后强制转换列(并将使用NaT填充nans,这是Not-A-Time标记,相当于日期时间的nan).这应该适用于0.10.1

In [22]: df
Out[22]: 
   value      date id
0      2  2013-3-1  a
1      3  2013-3-1  b
2      4  2013-3-1  c
3      5       NaN  d
4      6  2013-3-1  d

In [23]: df.dtypes
Out[23]: 
value     int64
date     object
id       object
dtype: object

In [24]: pd.to_datetime(df['date'])
Out[24]: 
0   2013-03-01 00:00:00
1   2013-03-01 00:00:00
2   2013-03-01 00:00:00
3                   NaT
4   2013-03-01 00:00:00
Name: date, dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)

如果您的数据中出现字符串'nan',则可以执行以下操作:

In [31]: s = Series(['2013-1-1','2013-1-1','nan','2013-1-1'])

In [32]: s
Out[32]: 
0    2013-1-1
1    2013-1-1
2         nan
3    2013-1-1
dtype: object

In [39]: s[s=='nan'] = np.nan

In [40]: s
Out[40]: 
0    2013-1-1
1    2013-1-1
2         NaN
3    2013-1-1
dtype: object

In [41]: pandas.to_datetime(s)
Out[41]: 
0   2013-01-01 00:00:00
1   2013-01-01 00:00:00
2                   NaT
3   2013-01-01 00:00:00
dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)


bdi*_*nte 4

na_values=["nan"]您可以在函数调用中传递参数read_csv。这将读取字符串 nan 值并将其转换为正确的np.nan格式。

请参阅此处了解更多信息。

  • 这仍然不起作用。我认为 na_values 选项不适用于正在解析为日期的列。问题实际上是 parse_dates 对于缺少值的列不起作用。 (2认同)