【发布时间】:2020-08-15 08:42:12
【问题描述】:
假设我有一些包含任意日期和时间信息的字符串,例如'2020-01-01T10:00:10.200', '2020-01-01 10:00', '2020-Jan-01'等
通过尝试将其转换为datetime 对象来确保每个字符串确实包含此类信息是相对简单的:
from dateutil.parser import parse
def is_datetime(mystring):
try:
parse(mystring)
return True
except ValueError:
return False
如果知道日期时间格式,也很容易将字符串转换为datetime 对象:
import datetime
dt_1 = datetime.datetime.strptime('2020-01-01T10:00:10.200', '%Y-%m-%dT%H:%M:%S.%f')
dt_2 = datetime.datetime.strptime('2020-01-01 10:00', '%Y-%m-%d %H:%M')
dt_3 = datetime.datetime.strptime('2020-Jan-01', '%Y-%b-%d')
但是,有没有办法根据给定的日期时间字符串确定 日期时间格式? 例如:
get_dt_format('2020-01-01T10:00:10.200') # should return '%Y-%m-%dT%H:%M:%S.%f'
get_dt_format('2020-01-01 10:00') # should return '%Y-%m-%d %H:%M'
get_dt_format('2020-Jan-01') # should return '%Y-%b-%d'
我设法通过检查每个字符串与可能的日期时间格式的集合来做到这一点,直到找到匹配项,但有没有更好、更有效的方法来做到这一点?
简化的当前解决方案:
def _try_format(mystring, dt_format):
try:
datetime.datetime.strptime(mystring, dt_format)
return True
except ValueError:
return False
def get_dt_format(mystring):
possible_formats = ['%Y-%m-%dT%H:%M:%S.%f', '%Y-%m-%d %H:%M', '%Y-%b-%d'] # and many others
for possible_format in possible_formats:
if _try_format(mystring, possible_format):
return possible_format
return 'Cannot determine format for ' + mystring
谢谢!
【问题讨论】:
-
你可能会在正则表达式之间找到更便宜的并尝试解析到日期
-
也可以看看
dateutil.parser.parse。 -
例如,如何判断 01-01-2020 是日-月-年还是月-日-年?
-
@Roy2012 对于超过 1 个可能的匹配,它会达到一个峰值并通知用户(或者为了简单起见,只达到第一个匹配)。
-
如果您真的想实现,请查看此库github.com/jeffreystarr/dateinfer 作为起点。使用 python3 导入失败,因此如果需要,请使用 this 修复
标签: python python-3.x datetime casting