2014-10-07 62 views
0

我有一大组日期时间字符串,可以安全地假定它们的格式都是相同的。例如,我可能有一组日期“7/1/13 0:45”,“5/2/13 6:21”,“7/15/13 1:24”,“7/9/13 12 :41“,”4/30/13 3:12“。这个想法应该是以合理的可靠性获得它们的通用格式,以便可以使用strptime或类似的语法进行分析。Python中许多格式相同的日期的猜测日期格式

有什么简单的方法来猜测格式?理想情况下,一个图书馆这样做?

+0

您可能的日期格式是否可以表示为以前已知格式的有限集合?如果是这样,你可以尝试通过bruteforce估计最好的一个:对于每个已知的格式,** try **来解析每个日期。计算每种格式的成功数量。获取最多次成功的格式。 (你也可以尝试所有现有的日期格式:p) – 2015-02-11 18:03:12

回答

2

退房https://github.com/jeffreystarr/dateinfer

似乎有点放弃了,但也许它会与你的需求。

+0

如果你可以请编辑你的答案,并解释你所展示的代码是做什么的,以及为什么/如何代码回答这个问题,这真的可以帮助。 – 2015-02-11 16:40:34

+0

它在这种情况下不起作用:'dateinfer.infer([“7/1/13 0:45”,“5/2/13 6:21”,“7/15/13 1:24”,“ 7/9/13 12:41“,”4/30/13 3:12“])' - >''%m /%d /%d%H:%M''但它应该是''%m /%d /%y%H:%M'' – jfs 2015-02-11 20:04:36

+0

您是否相信我以最接近相同的设计实现了我自己的解决方案? https://github.com/humangeo/DateSense/ – Sophie 2015-02-12 17:10:12

2

您是否尝试过使用dateutil.parser.parse对集合中的标记化时间字符串?

它对于各种格式通常都非常健壮,或者从出现的错误中变得显而易见,该如何轻松地将数据转换为适用的格式。

In [11]: dateutil.parser.parse("7/1/13 0:45") 
Out[11]: datetime.datetime(2013, 7, 1, 0, 45) 

请注意数据中的含糊不清。例如,它看起来不像您的时间戳使用24小时,而是会在同一天报告“下午3:00”和“上午3:00”。除非您有某种方式将am/pm分配给数据,否则解析器无法帮助您解决该问题。

如果您的日期字符串存储在一个iterable那么你可以使用map来解析功能适用于所有的字符串:

In [12]: the_dates = ["7/1/13 0:45", "12/2/14 1:38", "4/30/13 12:12"] 

In [13]: map(dateutil.parser.parse, the_dates) 
Out[13]: 
[datetime.datetime(2013, 7, 1, 0, 45), 
datetime.datetime(2014, 12, 2, 1, 38), 
datetime.datetime(2013, 4, 30, 12, 12)] 

而如果你需要一些额外的参数给dateutil.parser.parse这将指示要使用的格式,可以使用functools.partial首先绑定这些关键字参数,然后使用map来应用部分函数。

例如,假设您想特别小心DAY被视为第一个数字。你总是可以用额外的参数dayfirst=True调用parse,或者你可以预先绑定这个参数,并把它看作一个总是拥有这个属性的新函数。

In [42]: import functools 

In [43]: new_parse = functools.partial(dateutil.parser.parse, dayfirst=True) 

In [44]: map(new_parse, the_dates) 
Out[44]: 
[datetime.datetime(2013, 1, 7, 0, 45), 
datetime.datetime(2014, 2, 12, 1, 38), 
datetime.datetime(2013, 4, 30, 12, 12)] 

In [45]: new_parse.keywords 
Out[45]: {'dayfirst': True} 

In [46]: new_parse.func 
Out[46]: <function dateutil.parser.parse> 

(请注意,在这个例子中,第三日期不能用一天一分析,因为无论是30还是13可以是一个月...所以它回落到默认的格式,在这种情况下)。

+1

这是''7/1/13 0:45“和”1/7/13 0:45“''中的日期和月份? – 2014-10-07 14:26:58

+0

你可以用其他一些参数来控制它。我相信默认值是美国标准,首先是月份,但请检查文档以确保。 – ely 2014-10-07 14:27:47

+0

是的,但OP将如何区分? – 2014-10-07 14:29:01