使用pandas to_datetime()方法,语法正确,无法识别的值类型:str?

时间:2018-06-18 21:18:49

标签: python pandas csv date datetime

我正在努力使用pandas的to_datetime函数将csv文件中的条目转换为datetime对象,以便我可以将它们用于可视化。似乎我误解了如何创建日期时间对象或参数的简单方法。

我有一个csv文件,其中包含几个日期记录,一个日期/时间记录的示例(即一行csv文件的示例)......

date_column: 17-Apr-18 # day first (not-zero-padded), month abbrev, year
hour_and_seconds_column: 23:58:40 # hour, minute zero-padded, second

我想使用matplotlib可视化此csv文件中的每个时间。我正在阅读文档,我记得看到Matplotlib适用于datetime对象...所以我假设我需要使用pandas的to_datetime()方法来帮助我转换csv的每个日期/时间记录文件。

所以我有一个方法,首先从csv文件读取,创建一个列表列表,其中每个列表应该代表csv文件中的记录。我只读了3条记录。我不打算将代码包括在内,因为我怀疑它与我所遇到的问题有关,但我添加了一份印刷声明,它向我建议记录正在变得越来越重要正确阅读并保存在列表中......这里是三个记录的例子

    time_records = [[ID_IDENTIFIER, '14-Mar-18', '23:58:40'], [ID_IDENTIFIER, '14-Mar-18', '23:58:21'], [ID_IDENTIFIER, '14-Mar-18', '23:57:24']]

(ID_IDENTIFIER在代码中有一个实际的ID号)

我还认为,因为这些日期不一定是python传统的日期时间对象格式,所以当我调用pandas的to_datetime()方法时,我需要使用format参数。所以我创建了以下字符串变量来表示格式。我可能写错了......

    time_format_from_csv_str = time.strftime("%#d-%b-%y %H:%M:%S")

所以最后一部分是我创建了一个for循环来组合time_records中每个列表的最后两列。我只是要发布代码,但我将日/时信息与小时/分钟信息组合成一个字符串:

        for each in time_records:
            time_str = str(each[1]) + " " + str(each[2])
            print(time_str)
            a_date_object = pd.to_datetime(time_str, 
                format=time_format_from_csv_str)
    print(a_date_object)

一旦程序到达a_date_object的行,程序就会崩溃。错误消息很长,有两个部分。

  Traceback (most recent call last):
      File "C:\Users\biney\AppData\Roaming\Python\Python36\site-packages\pandas\core\tools\datetimes.py", line 377, in _convert_listlike
      values, tz = conversion.datetime_to_datetime64(arg)
      File "pandas\_libs\tslibs\conversion.pyx", line 188, in pandas._libs.tslibs.conversion.datetime_to_datetime64
      TypeError: Unrecognized value type: <class 'str'>

  During handling of the above exception, another exception occurred:

  Traceback (most recent call last):
      File "basic_content_analysis.py", line 303, in <module>
         main()
      File "basic_content_analysis.py", line 292, in main
         timestamp_date_visualization()
      File "basic_content_analysis.py", line 204, in timestamp_date_visualization
         a_date_object = pd.to_datetime(time_str, dayfirst=True, format=time_format_from_csv_str)
      File "C:\Users\biney\AppData\Roaming\Python\Python36\site-packages\pandas\core\tools\datetimes.py", line 469, in to_datetime
         result = _convert_listlike(np.array([arg]), box, format)[0]
      File "C:\Users\biney\AppData\Roaming\Python\Python36\site-packages\pandas\core\tools\datetimes.py", line 380, in _convert_listlike
         raise e
      File "C:\Users\biney\AppData\Roaming\Python\Python36\site-packages\pandas\core\tools\datetimes.py", line 347, in _convert_listlike
errors=errors)
      File "pandas\_libs\tslibs\strptime.pyx", line 157, in pandas._libs.tslibs.strptime.array_strptime
        ValueError: time data '14-Mar-18 23:58:40' does not match format '18-Jun-18 17:08:54' (match)

此时我不知道如何解决问题,因为我认为pd.to_datetime可以将字符串作为其参数。我也不知道我的字符串是如何与它给我的格式相符的。

我该如何修复这个错误?最后,我如何读取我的csv文件中的条目并将它们转换为日期时间对象(因为我非常确定这将是我能够使用matplotlib可视化时间数据的最佳方式?)

1 个答案:

答案 0 :(得分:0)

将格式参数更改为以下内容后修复此问题:

    a_date_object = pd.to_datetime(time_str, dayfirst=True, format="%d-%b-%y %H:%M:%S")

我想我的问题是......“我在pandas的to_datetime()方法中将一个看似相同的字符串变量传递给格式参数出了什么问题?”