重新格式化包含Pandas中日期的列

时间:2014-09-24 00:05:28

标签: python pandas

Python新手在这里从R切换到Python进行统计建模和分析。

我正在使用Pandas数据结构,并尝试重新构建包含' date'值。在下面的数据中,您会注意到某些值采用了' Mar-10'其他人采取的格式' 12/1/13'格式。如何重新构建包含' date'的Pandas数据结构中的列? (技术上不是日期结构),以便它们是统一的(包含相同的结构)。我更喜欢他们都遵循' Mar-10'格式。有人可以帮忙吗?

In [34]: dat["Date"].unique()
Out[34]: 
array(['Jan-10', 'Feb-10', 'Mar-10', 'Apr-10', 'May-10', 'Jun-10',
       'Jul-10', 'Aug-10', 'Sep-10', 'Oct-10', 'Nov-10', 'Dec-10',
       'Jan-11', 'Feb-11', 'Mar-11', 'Apr-11', 'May-11', 'Jun-11',
       'Jul-11', 'Aug-11', 'Sep-11', 'Oct-11', 'Nov-11', 'Dec-11',
       'Jan-12', 'Feb-12', 'Mar-12', 'Apr-12', 'May-12', 'Jun-12',
       'Jul-12', 'Aug-12', 'Sep-12', 'Oct-12', 'Nov-12', 'Dec-12',
       'Jan-13', 'Feb-13', 'Mar-13', 'Apr-13', 'May-13', '6/1/13',
       '7/1/13', '8/1/13', '9/1/13', '10/1/13', '11/1/13', '12/1/13',
       '1/1/14', '2/1/14', '3/1/14', '4/1/14', '5/1/14', '6/1/14',
       '7/1/14', '8/1/14'], dtype=object)

In [35]: isinstance(dat["Date"], basestring)  # not a string?
Out[35]: False

In [36]: type(dat["Date"]).__name__
Out[36]: 'Series'

1 个答案:

答案 0 :(得分:3)

我认为您的日期已经是字符串,请尝试:

import numpy as np
import pandas as pd
date = pd.Series(np.array(['Jan-10', 'Feb-10', 'Mar-10', 'Apr-10', 'May-10', 'Jun-10',
       'Jul-10', 'Aug-10', 'Sep-10', 'Oct-10', 'Nov-10', 'Dec-10',
       'Jan-11', 'Feb-11', 'Mar-11', 'Apr-11', 'May-11', 'Jun-11',
       'Jul-11', 'Aug-11', 'Sep-11', 'Oct-11', 'Nov-11', 'Dec-11',
       'Jan-12', 'Feb-12', 'Mar-12', 'Apr-12', 'May-12', 'Jun-12',
       'Jul-12', 'Aug-12', 'Sep-12', 'Oct-12', 'Nov-12', 'Dec-12',
       'Jan-13', 'Feb-13', 'Mar-13', 'Apr-13', 'May-13', '6/1/13',
       '7/1/13', '8/1/13', '9/1/13', '10/1/13', '11/1/13', '12/1/13',
       '1/1/14', '2/1/14', '3/1/14', '4/1/14', '5/1/14', '6/1/14',
       '7/1/14', '8/1/14'], dtype=object))

date.map(type).value_counts()
# date contains 56 strings
# <type 'str'>    56
# dtype: int64

查看每个元素的类型,而不是查看它们所包含的列的类型。

合理处理它们的最佳选择是将它们转换为pandas DateTime对象:

pd.to_datetime(date)
Out[18]: 
0    2014-01-10
1    2014-02-10
2    2014-03-10
3    2014-04-10
4    2014-05-10
5    2014-06-10
6    2014-07-10
7    2014-08-10
8    2014-09-10
...

您可能需要稍微使用这些格式,例如创建两个单独的数组 对于每种格式,然后将它们合并在一起:

# Convert the Aug-10 style strings
pd.to_datetime(date, format='%b-%y', coerce=True)
# Convert the 9/1/13 style strings
pd.to_datetime(date, format='%m/%d/%y', coerce=True)

我永远无法记住这些时间格式化代码,但是它们有一个很好的概述here