从Pandas的DatetimeIndex中生成月份和年份列表

8

我有一个信息数据框。我将接收的日期和时间设置为索引。现在我想要一个列表。

我使用以下方式设置df索引:

df.index = pd.to_datetime(df.index, format='%m/%d/%Y %H:%M')

这给了我这个结果:
print df.index
<class 'pandas.tseries.index.DatetimeIndex'>
[2014-07-28 09:42:08, ..., 2015-07-28 09:06:12]
Length: 15177, Freq: None, Timezone: None

我想要一个按顺序排列的月份和年份列表,以便用于绘图,如下所示:["Jan 2015", "Feb 2015", "Mar 2015", "Apr 2015", "May 2015", "June 2015", "Jul 2015", "Aug 2014", "Sep 2014", "Oct 2014", "Nov 2014", "Dec 2014"]。如何实现这一点?我查看了类似以下代码的东西:
df = [datetime.datetime.strftime(n,'%b-%Y') for n in pd.DataFrame(df).resample('M').index] 

但是这个代码会出现错误 DataError: No numeric types to aggregate

但是你真的想要一个日期时间列表吗?我怀疑你想要一个pandas DatetimeIndex或Series,特别是如果它是用于使用.loc[]切片索引。当你说“为了用于绘图”时,我怀疑你想要实际的日期时间来使用.loc[]进行切片,而不仅仅是绘图时间轴的字符串标签。 - smci
2个回答

15

原始回答

以下方法应该可行:将您的datetimeindex转换为系列, 这样您就可以调用apply并使用strftime返回一个字符串数组:

In [27]:
import datetime as dt
import pandas as pd
df = pd.DataFrame(index=pd.date_range(start = dt.datetime(2014,1,1), end = dt.datetime.now(), freq='M'))
df.index.to_series().apply(lambda x: dt.datetime.strftime(x, '%b %Y'))

Out[27]:
2014-01-31    Jan 2014
2014-02-28    Feb 2014
2014-03-31    Mar 2014
2014-04-30    Apr 2014
2014-05-31    May 2014
2014-06-30    Jun 2014
2014-07-31    Jul 2014
2014-08-31    Aug 2014
2014-09-30    Sep 2014
2014-10-31    Oct 2014
2014-11-30    Nov 2014
2014-12-31    Dec 2014
2015-01-31    Jan 2015
2015-02-28    Feb 2015
2015-03-31    Mar 2015
2015-04-30    Apr 2015
2015-05-31    May 2015
2015-06-30    Jun 2015
Freq: M, dtype: object

如果您想要一个列表,只需调用 tolist()
df.index.to_series().apply(lambda x: dt.datetime.strftime(x, '%b %Y')).tolist()

更新的回答

事实上,两年后看到这个问题,我意识到以上内容完全是不必要的。您只需要执行以下操作:

In [10]:
df.index.strftime('%Y-%b')

Out[10]:
array(['2014-Jan', '2014-Feb', '2014-Mar', '2014-Apr', '2014-May',
       '2014-Jun', '2014-Jul', '2014-Aug', '2014-Sep', '2014-Oct',
       '2014-Nov', '2014-Dec', '2015-Jan', '2015-Feb', '2015-Mar',
       '2015-Apr', '2015-May', '2015-Jun', '2015-Jul', '2015-Aug',
       '2015-Sep', '2015-Oct', '2015-Nov', '2015-Dec', '2016-Jan',
       '2016-Feb', '2016-Mar', '2016-Apr', '2016-May', '2016-Jun',
       '2016-Jul', '2016-Aug', '2016-Sep', '2016-Oct', '2016-Nov',
       '2016-Dec', '2017-Jan', '2017-Feb', '2017-Mar', '2017-Apr',
       '2017-May', '2017-Jun', '2017-Jul'], 
      dtype='<U8')

datetimeindex支持直接使用.dt访问器,无需转换为Series


0

从 pandas 1.0.x (2020) 开始,您可以直接执行此操作。您可以生成任意频率的任意 pd.date_range,然后将其转换为任意格式的 strftime()。所有这些都可以在一行中完成:

>>> pd.date_range(start='7/2019', end='6/2020', freq='M').strftime('%Y-%b')
Index(['2019-Jul', '2019-Aug', '2019-Sep', '2019-Oct', '2019-Nov', '2019-Dec',
       '2020-Jan', '2020-Feb', '2020-Mar', '2020-Apr', '2020-May'],
      dtype='object')

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