ValueError:未转换的数据仍然存在:00

Posted

技术标签:

【中文标题】ValueError:未转换的数据仍然存在:00【英文标题】:ValueError: unconverted data remains: 00 【发布时间】:2020-04-25 18:37:17 【问题描述】:

我正在使用pd.to_datetime() 方法将一列字符串转换为日期时间对象。

import pandas as pd import numpy as np

main = pd.read_csv('correctedstats.csv', nrows = 50) main['Date'] =
pd.to_datetime(main['Date'], format = '%d/%m/%y')

这给了我以下错误-

Traceback(最近一次调用最后一次):文件 “/Users/pranavmarla/jama/lib/python3.6/site-packages/pandas/core/tools/datetimes.py”, 第 448 行,在 _convert_listlike_datetimes 值,tz = conversion.datetime_to_datetime64(arg) 文件“pandas/_libs/tslibs/conversion.pyx”,第 200 行,在 pandas._libs.tslibs.conversion.datetime_to_datetime64 类型错误: 无法识别的值类型:

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次):文件“mergeDates.py”,第 8 行,在 main['Date'] = pd.to_datetime(main['Date'].astype(str), format = '%d/%m/%y') 文件 “/Users/pranavmarla/jama/lib/python3.6/site-packages/pandas/util/_decorators.py”, 第 208 行,在包装器中 返回 func(*args, **kwargs) 文件“/Users/pranavmarla/jama/lib/python3.6/site-packages/pandas/core/tools/datetimes.py”, 第 778 行,在 to_datetime values = convert_listlike(arg._values, True, format) 文件 "/Users/pranavmarla/jama/lib/python3.6/site-packages/pandas/core/tools/datetimes.py", 第 451 行,在 _convert_listlike_datetimes 提出电子文件“/Users/pranavmarla/jama/lib/python3.6/site-packages/pandas/core/tools/datetimes.py”, 第 416 行,在 _convert_listlike_datetimes arg,格式,exact=exact,errors=errors 文件“pandas/_libs/tslibs/strptime.pyx”,第 148 行,在 pandas._libs.tslibs.strptime.array_strptime ValueError:未转换 数据剩余:00

日期格式为“03/01/00”

如果我们通过以下方式将日期文本放入函数中,代码运行良好

pd.to_datetime('03/01/00', format = '%d/%m/%y')

我在这里做错了什么?

编辑 - companystats.csv -

0          1.0             34.0  Asian Paints        15.90  INE021A01026    03/01/00
1          2.0             34.0  Asian Paints        16.06  INE021A01026    04/01/00
2          3.0             34.0  Asian Paints        15.96  INE021A01026    05/01/00
3          4.0             34.0  Asian Paints        15.73  INE021A01026    06/01/00
4          5.0             34.0  Asian Paints        16.07  INE021A01026    07/01/00
5          6.0             34.0  Asian Paints        17.29  INE021A01026    10/01/00
6          7.0             34.0  Asian Paints        17.30  INE021A01026    11/01/00
7          8.0             34.0  Asian Paints        17.40  INE021A01026    12/01/00
8          9.0             34.0  Asian Paints        17.45  INE021A01026  13/01/2000
9         10.0             34.0  Asian Paints        17.08  INE021A01026  14/01/2000
10        11.0             34.0  Asian Paints        17.14  INE021A01026  17/01/2000
11        12.0             34.0  Asian Paints        17.25  INE021A01026  18/01/2000
12        13.0             34.0  Asian Paints        17.47  INE021A01026  19/01/2000
13        14.0             34.0  Asian Paints        17.52  INE021A01026  20/01/2000
14        15.0             34.0  Asian Paints        17.74  INE021A01026  21/01/2000
15        16.0             34.0  Asian Paints        19.10  INE021A01026  24/01/2000
16        17.0             34.0  Asian Paints        20.61  INE021A01026  25/01/2000
17        18.0             34.0  Asian Paints        19.71  INE021A01026  27/01/2000
18        19.0             34.0  Asian Paints        20.03  INE021A01026  28/01/2000
19        20.0             34.0  Asian Paints        19.19  INE021A01026  31/01/2000
20        21.0             34.0  Asian Paints        19.18  INE021A01026    01/02/00
21        22.0             34.0  Asian Paints        19.17  INE021A01026    02/02/00
22        23.0             34.0  Asian Paints        19.00  INE021A01026    03/02/00
23        24.0             34.0  Asian Paints        19.03  INE021A01026    04/02/00

编辑 - 已解决!我的日期列有两种类型的日期;

21/01/2000

02/02/00

我使用 pd.to_datetime() 方法的 errors 属性创建了两个单独的列,然后我将它们合并为我想要的列

pd.to_datetime(main,format = '%d/%m/%y', errors = 'coerce')

pd.to_datetime(main,format = '%d/%m/%Y', errors = 'coerce')

欢迎提供更优雅的解决方案

【问题讨论】:

您可以发布来自correctedstats.csv 的示例数据吗?问题可能在那里 我已经添加了,请查看 【参考方案1】:

这是查看函数失败位置的好方法:

df = pd.DataFrame('date': ['03/01/00','13/01/2000','00/01/00'])

def date_format(f):
    try:
        return pd.to_datetime(f)
    except Exception as e:
        return e.args

print(df['date'].apply(date_format))

0          2000-03-01 00:00:00
1          2000-01-13 00:00:00
2    (month must be in 1..12,)

【讨论】:

由于我正在阅读 '%d/%m/%y' 并且我的所有字符串在该上下文中都是有效的,这将如何适用? 它将显示函数在哪个索引处失败,即在我的示例中,它在索引 2 处失败,然后检查索引处的格式/类型以进一步调查失败【参考方案2】:

尝试将 infer_datetime_format 作为 true 传递,可能是在您的数据中,日期不是您传递的格式

pd.to_datetime(df['Date'], infer_datetime_format=True) 

OR 传递错误 = '忽略'

pd.to_datetime(df['Date'], format = '%d/%m/%y',errors='ignore')

【讨论】:

两个都试过了,推断格式只是给了我错误的输出(月份为天、天和月)并且忽略它会忽略所有行。 如果可以的话,可以分享一下示例数据吗? 已添加到帖子中,请查看

以上是关于ValueError:未转换的数据仍然存在:00的主要内容,如果未能解决你的问题,请参考以下文章

ValueError: Expected 2D array, got 1D array 相反,在将 1D 数组转换为 2D 后坚持

PIL/Pillow - ValueError: py.__spec__ 未设置

如何修复'ValueError:shapes(1,3)和(1,1)未对齐:3(dim 1)!= 1(dim 0)'numpy中的错误

尽管存在索引,但未定义的索引仍然存在

Keras ValueError:尺寸必须相等问题

ValueError:无法强制转换为 Series,长度必须为 1:给定 n