strptime 格式不匹配,即使它看起来正确?
strptime format not matching even though it looks correct?
我在尝试解析日期时间时遇到错误:
ValueError: ("time data '2019-07-05T10:19:42+00:00' does not match format '%Y-%m-%dT%H:%M:%S%z'", 'occurred at index 0')
产生此错误的行是:
df['yearmonth'] = df.apply(lambda row: datetime.strptime(row['createdAt'], '%Y-%m-%dT%H:%M:%S%z').strftime("%Y%m"), axis=1)
据我所知,格式是正确的,代码在其他机器上运行良好。
当我从格式中删除 %z 并只取一部分要格式化的数据时,它会起作用,例如:
df['yearmonth'] = df.apply(lambda row: datetime.strptime(row['createdAt'][:19], '%Y-%m-%dT%H:%M:%S').strftime("%Y%m"), axis=1)
所以我猜 %z 导致了问题。我认为问题与语言环境有关,但我尝试以各种不同的方式设置语言环境,但均未成功。
非常希望了解如何在不使用切片的情况下解决此问题!
Python 2 strptime()
函数确实 不支持时区的 %z 格式(因为底层 time.strptime() 函数不支持它)。您有两个选择:
用strptime解析时忽略时区:
time_obj = datetime.datetime.strptime(time_str[:19], '%Y-%m-%dT%H:%M:%S')
使用 dateutil 模块,它的解析函数确实处理时区:
from dateutil.parser import parse
time_obj = parse(time_str)
您也可以升级到 Python 3.2 或更高版本,其中时区支持已改进到 %z
可以工作的程度,前提是您删除最后一个 : 来自输入,而 - 来自 %z
之前
如果可以,考虑使用dateutil
:
import datetime
import dateutil.parser
my_date_str = '2019-07-05T10:19:42+00:00'
my_date = dateutil.parser.parse(my_date_str)
print(type(my_date)) # <class 'datetime.datetime'>
print(my_date.strftime('%Y%m')) # 201907
虽然 Python 3.6 支持解析“%z”,但采用这种格式时:
+HHMM or -HHMM
如果日期的这一部分包含冒号,则不支持解析“%z”:
+HH:MM or -HH:MM
但是,Python3.7 确实支持在“%z”部分中有冒号时对其进行解析。
因此,使用 Python 3.7 而不是 Python 3.6 将解决此问题。
我在尝试解析日期时间时遇到错误:
ValueError: ("time data '2019-07-05T10:19:42+00:00' does not match format '%Y-%m-%dT%H:%M:%S%z'", 'occurred at index 0')
产生此错误的行是:
df['yearmonth'] = df.apply(lambda row: datetime.strptime(row['createdAt'], '%Y-%m-%dT%H:%M:%S%z').strftime("%Y%m"), axis=1)
据我所知,格式是正确的,代码在其他机器上运行良好。
当我从格式中删除 %z 并只取一部分要格式化的数据时,它会起作用,例如:
df['yearmonth'] = df.apply(lambda row: datetime.strptime(row['createdAt'][:19], '%Y-%m-%dT%H:%M:%S').strftime("%Y%m"), axis=1)
所以我猜 %z 导致了问题。我认为问题与语言环境有关,但我尝试以各种不同的方式设置语言环境,但均未成功。
非常希望了解如何在不使用切片的情况下解决此问题!
Python 2 strptime()
函数确实 不支持时区的 %z 格式(因为底层 time.strptime() 函数不支持它)。您有两个选择:
用strptime解析时忽略时区:
time_obj = datetime.datetime.strptime(time_str[:19], '%Y-%m-%dT%H:%M:%S')
使用 dateutil 模块,它的解析函数确实处理时区:
from dateutil.parser import parse
time_obj = parse(time_str)
您也可以升级到 Python 3.2 或更高版本,其中时区支持已改进到 %z
可以工作的程度,前提是您删除最后一个 : 来自输入,而 - 来自 %z
如果可以,考虑使用dateutil
:
import datetime
import dateutil.parser
my_date_str = '2019-07-05T10:19:42+00:00'
my_date = dateutil.parser.parse(my_date_str)
print(type(my_date)) # <class 'datetime.datetime'>
print(my_date.strftime('%Y%m')) # 201907
虽然 Python 3.6 支持解析“%z”,但采用这种格式时:
+HHMM or -HHMM
如果日期的这一部分包含冒号,则不支持解析“%z”:
+HH:MM or -HH:MM
但是,Python3.7 确实支持在“%z”部分中有冒号时对其进行解析。
因此,使用 Python 3.7 而不是 Python 3.6 将解决此问题。