Python Can';t将时间字符串从csv转换为datetime

Python Can';t将时间字符串从csv转换为datetime,python,datetime,python-datetime,Python,Datetime,Python Datetime,我有一个csv文件,每行有2个时间戳,包括日期、时间和值: 02.04.2019 00:30:30;02.04.2019 00:36:05;6354 02.04.2019 02:36:05;02.04.2019 03:41:40;3453 02.04.2019 03:41:40;02.04.2019 04:47:15;5456 当我尝试将日期和时间字符串转换为datetime时: with open("file.csv", "rt", encoding='utf-8-sig') as sour

我有一个csv文件,每行有2个时间戳,包括日期、时间和值:

02.04.2019 00:30:30;02.04.2019 00:36:05;6354
02.04.2019 02:36:05;02.04.2019 03:41:40;3453
02.04.2019 03:41:40;02.04.2019 04:47:15;5456
当我尝试将日期和时间字符串转换为datetime时:

with open("file.csv", "rt", encoding='utf-8-sig') as source:
    reader = csv.reader(source)
    for row in csv.reader(source, delimiter=";"):
        dateTimeBegin = row[0]
        dateTimeEnd = row[1]
        begin_intervall = datetime.datetime.strptime("%d.%m.%Y %I:%M:%S", dateTimeBegin)
        end_intervall = datetime.datetime.strptime("%d.%m.%Y %I:%M:%S", dateTimeEnd)
我得到:

Traceback (most recent call last):
  File ".\compare.py", line 48, in <module>
    begin_intervall = datetime.datetime.strptime("%d.%m.%Y %I:%M:%S", dateTimeBegin)
  File "C:\Users\foobar\AppData\Local\Programs\Python\Python38-32\lib\_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "C:\Users\foobar\AppData\Local\Programs\Python\Python38-32\lib\_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data '%d.%m.%Y %I:%M:%S' does not match format '02.04.2019 00:30:30'
它很好用

编辑: 我交换了格式和时间字符串,并使用了一些其他数据:

02.04.2019 01:30:30;02.04.2019 02:36:05;6354 #works
02.04.2019 02:36:05;02.04.2019 03:41:40;3453 #works
02.04.2019 03:41:40;02.04.2019 04:47:15;5456 #works
03.04.2019 00:25:03;03.04.2019 01:30:12;5997 #ERROR
03.04.2019 01:30:12;03.04.2019 02:35:21;5993
03.04.2019 02:35:21;03.04.2019 03:40:30;5994
错误仍然是:

Traceback (most recent call last):
  File ".\new.py", line 12, in <module>
    begin_intervall = datetime.datetime.strptime(dateTimeBegin, "%d.%m.%Y %I:%M:%S")
  File "C:\Users\foobar\AppData\Local\Programs\Python\Python38-32\lib\_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "C:\Users\foobar\AppData\Local\Programs\Python\Python38-32\lib\_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data '03.04.2019 00:25:03' does not match format '%d.%m.%Y %I:%M:%S'
回溯(最近一次呼叫最后一次):
文件“\new.py”,第12行,在
begin_intervall=datetime.datetime.strtime(dateTimeBegin,“%d.%m.%Y%I:%m:%S”)
文件“C:\Users\foobar\AppData\Local\Programs\Python\Python38-32\lib\ \u strtime.py”,第568行,在_strtime\u datetime中
tt,分数,gmtoff\u分数=\u strTime(数据字符串,格式)
文件“C:\Users\foobar\AppData\Local\Programs\Python\Python38-32\lib\\ u strtime.py”,第349行,在\ u strtime中
raise VALUERROR(“时间数据%r与格式%r不匹配”%
ValueError:时间数据“03.04.2019 00:25:03”与格式“%d.%m.%Y%I:%m:%S”不匹配

似乎是00:25:03。但是%I是24小时格式。

您以错误的顺序给出参数。日期字符串需要先给出,然后是格式字符串。

您以错误的顺序给出参数。日期字符串需要先给出,然后是格式字符串。

根据日期时间

函数定义为
datetime.strtime(日期字符串,格式)

这意味着第一个参数将是日期字符串
(2019年4月2日01:30:30)
或变量
dateTimeBegin
,第二个参数将是格式字符串
(“%d.%m.%Y%I:%m:%S”)

根据日期时间

函数定义为
datetime.strtime(日期字符串,格式)


这意味着第一个参数将是日期字符串
(2019年4月2日01:30:30)
或变量
dateTimeBegin
,第二个参数将是格式字符串
(“%d.%m.%Y%I:%m:%S”)

我认为,对于像
02.04.2019 01:30:30
这样的例子来说,这是有效的,但不是
03.04.2019 00:25:03
,因为
%H
的小时数应该在0到23之间,而
%I
的小时数应该在1到12之间,你可以找到一个表。这是因为
%H
代表24小时内的一小时格式,而
%I
以12小时格式表示小时

若要解决此问题,应将格式字符串设置为
'%d.%m.%Y%H:%m:%S'
,而不是
'%d.%m.%Y%I:%m:%S'


顺便说一句,如果你是记录这些时间戳的人,因此可以控制它们的记录方式,我建议改为使用。这是因为它们更容易来回转换,并且不会对这些时间戳的时区产生歧义。但是,如果你决定这样做,请确保本地化你的
datetime
对象,然后再将其作为unix时间戳保存到CSV文件中。这个问题有很多很好的例子说明了如何做到这一点。

我认为,对于像
02.04.2019 01:30:30
这样的例子,这样做的原因是
03.04.2019 00:25:03
的小时数应该在0到23之间和1到12对于
%I
,您可以找到此表。这是因为
%H
表示24小时格式的小时,而
%I
表示12小时格式的小时

若要解决此问题,应将格式字符串设置为
'%d.%m.%Y%H:%m:%S'
,而不是
'%d.%m.%Y%I:%m:%S'


顺便说一句,如果你是记录这些时间戳的人,因此可以控制它们的记录方式,我建议改为使用。这是因为它们更容易来回转换,并且不会对这些时间戳的时区产生歧义。但是,如果你决定这样做,请确保本地化你的
datetime
对象,然后再将它们作为unix时间戳保存到CSV文件中。这个问题有很多很好的例子说明如何做到这一点。

更改
begin\u intervall=datetime.datetime.strtime(“%d.%m.%Y%I:%m:%S”,dateTimeBegin)end\u intervall=datetime.datetime.strtime(“%d.%m.%Y%I:%m:%S”,dateTimeEnd)
to
begin\u intervall=datetime.datetime.strtime(dateTimeBegin,“%d.%m.%Y%I:%m:%S”)end\u intervall=datetime.datetime.strtime(dateTimeEnd,“%d.%m.%Y%I:%m:%S”)
无法解决此问题。错误消息是相同的。这很奇怪……您能给出一个最小的可复制示例吗?更改
begin\u intervall=datetime.datetime.strtime(“%d.%m.%Y%I:%m:%s”,dateTimeBegin)end\u intervall=datetime.datetime.strtime(“%d.%m.%Y%I:%m:%s”,dateTimeEnd)
to
begin\u intervall=datetime.datetime.strtime(dateTimeBegin,“%d.%m.%Y%I:%m:%S”)end\u intervall=datetime.datetime.strtime(dateTimeEnd,“%d.%m.%Y%I:%m:%S”)
无法解决问题。错误消息是相同的。这很奇怪……你能给出一个最小的可复制示例吗?如果你更改了代码,并且错误消息是相同的,那么你一定运行了错误的代码。或者错误仍然是一样的。我已经交换了格式和日期字符串。变量和函数名称应该跟在
的后面带下划线的r_case_
样式。您的程序中似乎混合了两种不同的命名约定。如果更改了代码且错误消息相同,则您一定运行了错误的代码。或者错误仍然相同。我已经交换了格式和日期字符串。变量和函数名称应在带und的
小写字母后面erscores
风格。您的程序中似乎混合了两种不同的命名约定。非常感谢!很遗憾,我无法控制记录。这是最糟糕的情况:数据由科学设备记录,然后以Excel格式提供,不可能更改格式或其他任何内容。非常感谢!抱歉布莱:我无法控制记录。这是最糟糕的情况:数据是由科学设备记录的,然后以Excel、wi格式提供
Traceback (most recent call last):
  File ".\new.py", line 12, in <module>
    begin_intervall = datetime.datetime.strptime(dateTimeBegin, "%d.%m.%Y %I:%M:%S")
  File "C:\Users\foobar\AppData\Local\Programs\Python\Python38-32\lib\_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "C:\Users\foobar\AppData\Local\Programs\Python\Python38-32\lib\_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data '03.04.2019 00:25:03' does not match format '%d.%m.%Y %I:%M:%S'