Pandas to_datetime 解析错误:未知字符串格式

问题描述 投票:0回答:2

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

Start Date
1/7/13
1/7/13
1/7/13
16/7/13
16/7/13

当我将其转换为日期格式时,出现以下错误:

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

我在这里错过了什么?

python pandas dataframe datetime parse-error
2个回答
22
投票

我认为问题出在数据上——存在一个有问题的字符串。所以你可以尝试检查

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

0
投票

最近的 pandas 版本(例如 1.5.0)抛出一个有用的错误,显示无法解析的字符串在列中的位置。也就是说,解决此错误的一种常见方法是传递正确的

format=
特别是如果日期具有某种“奇特”格式(有关所有可能格式的列表,请查看 https://strftime.org/)这样有下划线(
_
),破折号(
),意想不到的空白作为分隔符。

df = pd.DataFrame({'date': ['19_Mar_2017']})
pd.to_datetime(df['date'])                      # error
pd.to_datetime(df['date'], format='%d_%b_%Y')   # OK

df = pd.DataFrame({'date': ['19.Mar. 2017']})
pd.to_datetime(df['date'])                      # error
pd.to_datetime(df['date'], format='%d.%b. %Y')  # OK

如果日期时间具有混合格式,请使用

errors='coerce'
参数传递不同的格式并使用
fillna()
组合所有格式。例如,

df = pd.DataFrame({'date': ['19.Mar. 2017', '20.Mar.2017']})  # <--- has mixed format
first = pd.to_datetime(df['date'], format='%d.%b. %Y', errors='coerce')
second = pd.to_datetime(df['date'], format='%d.%b.%Y', errors='coerce')
df['date'] = first.fillna(second)

顺便说一句,如果数据是从文件导入的,将此类文件读入数据帧的 pandas 函数具有

parse_dates=
参数,可用于解析日期。

# from csv
df = pd.read_csv('foo.csv', parse_dates=True)

# from Excel
df = pd.read_excel('foo.xlsx', parse_dates=True)
© www.soinside.com 2019 - 2024. All rights reserved.