从Pandasdate时间列(Python)中仅提取月份和年份

我有一个Dataframe,DF,与以下列:

df['ArrivalDate'] = ... 936 2012-12-31 938 2012-12-29 965 2012-12-31 966 2012-12-31 967 2012-12-31 968 2012-12-31 969 2012-12-31 970 2012-12-29 971 2012-12-31 972 2012-12-29 973 2012-12-29 ... 

该列的元素是pandas.tslib.Timestamp。

我想只包括年份和月份。 我以为会有简单的方法来做到这一点,但我无法弄清楚。

以下是我所尝试的:

 df['ArrivalDate'].resample('M', how = 'mean') 

我得到了以下错误:

 Only valid with DatetimeIndex or PeriodIndex 

然后我试着:

 df['ArrivalDate'].apply(lambda(x):x[:-2]) 

我得到了以下错误:

 'Timestamp' object has no attribute '__getitem__' 

有什么build议么?

编辑:我有点想通了。

 df.index = df['ArrivalDate'] 

然后,我可以使用索引重新采样另一列。

但我仍然喜欢重新configuration整个列的方法。 有任何想法吗?

您可以直接访问yearmonth属性,或请求一个datetime.datetime

 In [15]: t = pandas.tslib.Timestamp.now() In [16]: t Out[16]: Timestamp('2014-08-05 14:49:39.643701', tz=None) In [17]: t.to_datetime() Out[17]: datetime.datetime(2014, 8, 5, 14, 49, 39, 643701) In [18]: t.day Out[18]: 5 In [19]: t.month Out[19]: 8 In [20]: t.year Out[20]: 2014 

一种结合年份和月份的方法是对它们进行整数编码,比如2014年8月份的201408沿着整个列,可以这样做:

 df['YearMonth'] = df['ArrivalDate'].map(lambda x: 1000*x.year + x.month) 

或其许多变体。

尽pipe如此,我并不是很喜欢这样做,因为它会使datealignment和算术更加痛苦,而对于那些在没有这种约定的情况下来到您的代码或数据的其他人来说尤其痛苦。 更好的方法是select一个按date的会议,比如最后的非美国节假日或第一天等,并按照所选date约定将数据保留为date/时间格式。

calendar模块对于获取特定日子的数字值是有用的,例如最后一个工作日。 那么你可以做一些事情:

 import calendar import datetime df['AdjustedDateToEndOfMonth'] = df['ArrivalDate'].map( lambda x: datetime.datetime( x.year, x.month, max(calendar.monthcalendar(x.year, x.month)[-1][:5]) ) ) 

如果你正在寻找一种方法来解决简单的问题,只需要将datetime列格式化为一些string化的表示forms,那么可以使用datetime.datetime类中的strftime函数,如下所示:

 In [5]: df Out[5]: date_time 0 2014-10-17 22:00:03 In [6]: df.date_time Out[6]: 0 2014-10-17 22:00:03 Name: date_time, dtype: datetime64[ns] In [7]: df.date_time.map(lambda x: x.strftime('%Y-%m-%d')) Out[7]: 0 2014-10-17 Name: date_time, dtype: object 

如果你想分别显示年份和月份的新列,你可以这样做:

 df['year'] = pd.DatetimeIndex(df['ArrivalDate']).year df['month'] = pd.DatetimeIndex(df['ArrivalDate']).month 

要么…

 df['year'] = df['ArrivalDate'].dt.year df['month'] = df['ArrivalDate'].dt.month 

那么你可以把它们结合起来,或者像他们一样和他们一起工作。

最好的方式find

date_column必须是date时间格式。

 import datetime as dt df['month_year'] = df.date_column.dt.to_period('M') 

更新 – 从我这里find另一个标题为“ find最佳方式 ”的答案。 这真的是最好的方法:)

如果你想要月份独特的一对,使用apply是相当光滑的。

  df['mnth_yr'] = df['date_column'].apply(lambda x: x.strftime('%B-%Y')) 

在一列中输出每月的年份。

不要忘了先把格式改成date,我一般会忘记:|

  df['date_column'] = pd.to_datetime(df['date_column']) 

感谢jaknap32 ,我想根据年份和月份汇总结果,所以这工作:

 df_join['YearMonth'] = df_join['timestamp'].apply(lambda x:x.strftime('%Y%m')) 

产量很好:

 0 201108 1 201108 2 201108 
 df['year_month']=df.datetime_column.apply(lambda x: str(x)[:7]) 

这对我来说很好,不认为pandas会把结果stringdate解释为date,但是当我做了情节,它非常清楚我的日程安排和stringyear_month在哪里下令正确…得爱大pandas!

你可以先把你的datestring转换成pandas.to_datetime ,这样就可以访问所有numpy的datetime和timedelta工具。 例如:

 df['ArrivalDate'] = pandas.to_datetime(df['ArrivalDate']) df['Month'] = df['ArrivalDate'].values.astype('datetime64[M]')