Pandas不一致的日期时间格式

3

我大约两周前开始使用pandas库,学习新的功能。我需要帮助解决以下问题。

我有一列日期数据,格式混合。这里有两种格式:

  1. mm/dd/yyyy
  2. dd/mm/yyyy

数据集的一个摘录:

Dates  
6/5/2016  
7/5/2016  
7/5/2016  
7/5/2016  
9/5/2016  
9/5/2016  
9/5/2016  
9/5/2016  
5/13/2016  
5/14/2016  
5/14/2016  

我很难将它们转换为一种通用格式。我尝试使用pandas的“to_datetime”。但它不起作用。 我也不确定在这种情况下如何使用正则表达式会有所帮助。
另一个信息是,日期是按顺序排列的。是否可以使用info做些什么。
编辑1: 我知道如果单独看6/4/2016和5/6/2016,无法区分它们。然而,我希望由于日期按升序排列,并且实际数据集分布在一年之内,会有一种方法来理解它。是否有人知道可以根据日期升序排列的事实来理解给定格式的函数?
编辑2: 两个月的样本:2016年4月和5月。请注意,没有模式。因此,请不要基于下面数据的模式提出任何解决方案。
4/1/2016 4/1/2016 4/3/2016 4/3/2016 3/4/2016 4/4/2016 4/4/2016 4/5/2016 4/5/2016 4/7/2016 4/7/2016 4/8/2016 4/8/2016 4/14/2016 4/16/2016 6/4/2016 7/4/2016 8/4/2016 11/4/2016 11/4/2016 11/4/2016 11/4/2016 11/4/2016 12/4/2016 12/4/2016 12/4/2016 13/4/2016 13/4/2016 13/4/2016 13/4/2016 14/04/2016 15/4/2016 16/4/2016 16/4/2016 18/4/2016 18/4/2016 19/4/2016 19/4/2016 20/4/2016 20/4/2016 21/4/2016 21/4/2016 21/4/2016 22/4/2016 23/4/2016 23/4/2016 25/4/2016 25/4/2016 26/4/2016 26/4/2016 26/4/2016 26/4/2016 26/4/2016 26/4/2016 29/4/2016 29/4/2016 29/4/2016 30/4/2016 2/5/2016 2/5/2016 3/5/2016 3/5/2016 3/5/2016 3/5/2016 4/5/2016 5/4/2016 5/4/2016 5/4/2016 6/5/2016 6/5/2016 7/5/2016 7/5/2016 7/5/2016 9/5/2016 9/5/2016 9/5/2016 9/5/2016 10/5/2016 10/5/2016 11/5/2016 11/5/2016 12/5/2016 5/13/2016 5/14/2016 5/14/2016 5/15/2016 5/16/2016 5/16/2016 5/16/2016 5/16/2016 5/16/2016 5/16/2016 5/16/2016 5/17/2016 5/17/2016 5/18/2016 5/18/2016 5/19/2016 5/19/2016 5/20/2016 5/20/2016 5/20/2016 5/20/2016 5/20/2016 5/21/2016 5/23/2016 5/23/2016 5/23/2016 5/23/2016 5/23/2016 5/23/2016 5/24/2016 5/24/2016 5/25/2016 5/26/2016 5/26/2016 5/26/2016 5/27/2016 5/27/2016 5/27/2016 5/27/2016 5/27/2016 5/27/2016 5/27/2016 5/28/2016 5/30/2016 5/30/2016

我已经查看了这篇文章。然而,即使使用error='coerce',它对我的数据集也不起作用。 - Amit
@jezrael: 首先,非常感谢您的回复!是的,日期列不一致。这些数据是在电子表格上维护的。人们没有遵循一致的日期格式。 我知道如果仅仅看它们本身,无法区分6/4/2016和5/6/2016之间的差异。但是,我希望通过日期按升序排列,并且实际数据集持续了一年多,应该可以找到一种方法来理解它。 - Amit
@Amit - 一个月有多少天?有多少是损坏的?5%,50%? - jezrael
@Amit - 你能添加两个月的样例吗? - jezrael
@jezrael:示例代码已添加。4月份,主要格式为dd/mm/yyyy,但5月份为mm/dd/yyyy。 - Amit
显示剩余2条评论
1个回答

1
实际问题在于您的数据集中存在模棱两可的日期(如果可以同时是mm/dd/yyyy或dd/mm/yyyy,您应该如何解析它??[我曾经遇到过这种情况,我们决定选择大多数人使用的格式;本质上,数据集已经受损...因此我们不得不将其视为受损的数据集)。
如果它是一个系列,那么使用pd.to_datetime似乎可以解决问题:
In [11]: s = pd.Series(['6/5/2016', '7/5/2016', '7/5/2016', '7/5/2016', '9/5/2016', '9/5/2016', '9/5/2016', '9/5/2016', '5/13/2016', '5/14/2016', '5/14/2016'])

In [12]: pd.to_datetime(s)
Out[12]:
0    2016-06-05
1    2016-07-05
2    2016-07-05
3    2016-07-05
4    2016-09-05
5    2016-09-05
6    2016-09-05
7    2016-09-05
8    2016-05-13
9    2016-05-14
10   2016-05-14
Name: 0, dtype: datetime64[ns]

注意:如果您有一个一致的格式,可以显式地传递它:
In [13]: pd.to_datetime(s, format="%m/%d/%Y")
Out[13]:
0    2016-06-05
1    2016-07-05
2    2016-07-05
3    2016-07-05
4    2016-09-05
5    2016-09-05
6    2016-09-05
7    2016-09-05
8    2016-05-13
9    2016-05-14
10   2016-05-14
Name: 0, dtype: datetime64[ns]

谢谢回复! 我发布的日期实际上是五月份的。但是pd.to_datetime()将2014年7月5日理解为2016年7月5日。 我知道如果单独看这两个日期,无法区分2016年6月4日和2016年5月6日之间的差别。然而,我希望由于日期是按升序排列的,并且实际数据集跨越了一年,应该有一种方法来理解它。您是否知道任何可以利用这一事实并理解日期的函数? - Amit
你可以使用 dayfirst=True(但不能解决歧义)。让我想一想如何变得单调。编辑:这很粗糙,因为蛮力搜索(找到单调解的)可能是2^N(或更可能是2 ^(N/3),因为大多数日期都是非歧义的)。 - Andy Hayden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接