【问题标题】:Pandas to_datetime ValueError: Unknown string formatPandas to_datetime ValueError:未知的字符串格式
【发布时间】:2016-04-03 00:21:01
【问题描述】:

我的(熊猫)数据框中有一列:

data['Start Date'].head()
type(data['Start Date'])
Output:
1/7/13
1/7/13
1/7/13
16/7/13
16/7/13
<class 'pandas.core.series.Series'>

当我将其转换为日期格式(如下)时,我收到错误 ValueError: Unknown string format

data['Start Date']= pd.to_datetime(data['Start Date'],dayfirst=True)
...
...
/Library/Python/2.7/site-packages/pandas/tseries/tools.pyc in _convert_listlike(arg, box, format, name)
    381                 return DatetimeIndex._simple_new(values, name=name, tz=tz)
    382             except (ValueError, TypeError):
--> 383                 raise e
    384 
    385     if arg is None:

ValueError: Unknown string format

我在这里错过了什么?

【问题讨论】:

  • 列中元素的具体数据类型是什么?
  • 您可以通过errors='coerce'(或早期版本中的coerce=True),然后查看哪个项目转换为NaT(因此无法转换为日期时间)
  • 类型是对象。我猜它被认为是字符串?
  • 这可能确实是字符串(但也可以混合)。你试过我的建议了吗?

标签: python pandas


【解决方案1】:

我认为问题出在数据上 - 存在有问题的字符串。所以你可以尝试检查Start Date列中字符串的长度:

import pandas as pd
import io

temp=u"""Start Date
1/7/13
1/7/1
1/7/13 12 17
16/7/13
16/7/13"""

data = pd.read_csv(io.StringIO(temp), sep=";", parse_dates=False)

#data['Start Date']= pd.to_datetime(data['Start Date'],dayfirst=True)
print data

     Start Date
0        1/7/13
1         1/7/1
2  1/7/13 12 17
3       16/7/13
4       16/7/13

#check, if length is more as 7
print data[data['Start Date'].str.len() > 7]

     Start Date
2  1/7/13 12 17

或者您可以尝试以不同的方式找到这些有问题的行,例如只读部分日期时间并检查解析日期时间:

#read first 3 rows
data= data.iloc[:3]

data['Start Date']= pd.to_datetime(data['Start Date'],dayfirst=True)

但这只是提示。

编辑:

感谢 joris 的建议,将参数 errors ='coerce' 添加到 to_datetime

temp=u"""Start Date
1/7/13
1/7/1
1/7/13 12 17
16/7/13
16/7/13 12 04"""

data = pd.read_csv(io.StringIO(temp), sep=";")
#add parameter errors coerce
data['Start Date']= pd.to_datetime(data['Start Date'], dayfirst=True, errors='coerce')
print data

  Start Date
0 2013-07-01
1 2001-07-01
2        NaT
3 2013-07-16
4        NaT

#index of data with null - NaT to variable idx
idx = data[data['Start Date'].isnull()].index
print idx

Int64Index([2, 4], dtype='int64')

#read csv again
data = pd.read_csv(io.StringIO(temp), sep=";")

#find problematic rows, where datetime is not parsed
print data.iloc[idx]

      Start Date
2   1/7/13 12 17
4  16/7/13 12 04

【讨论】:

  • 数据来自 CSV 文件。当我查看 Excel 上的数据时,它看起来很好,就像常规的日期格式一样。日期的长度并不少见。
  • 向下钻取每条记录时。我意识到有一些编码空白问题,需要修剪。事实证明,“长度”的验证方式帮助了这个案例。谢谢
  • 如何修剪不寻常的空白。我想我的整个专栏都有一个额外的空格。
  • @deadcode - 使用data['Start Date']= pd.to_datetime(data['Start Date'].str.strip(), dayfirst=True)
猜你喜欢
  • 2019-03-01
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 2021-11-09
  • 2018-11-10
  • 2021-04-16
  • 2023-02-10
相关资源
最近更新 更多