在 Pandas 中列出月份和年份

Posted

技术标签:

【中文标题】在 Pandas 中列出月份和年份【英文标题】:Make a list of months and years in Pandas 【发布时间】:2015-11-28 07:50:06 【问题描述】:

我正在尝试制作一个包含去年月份范围的 date_list。格式应该是['Oct 2014', 'Nov 2014', 'Dec 2014', 'Jan 2015', 'Feb 2015',... 'Sep 2015']

有时它会起作用,有时它会切断当前月份。在这个月的最后一天,它不起作用,所以我做了这个 if 声明。

#If it is the last day of the month, go back a year and add a day to start at beginning of the month
#Otherwise, go back a year, go to the end of the month, and add a day to start at the beginning of the month

if datetime.datetime.now().day == calendar.monthrange(date.year, date.month)[1]:
    range_min = range_max - pd.tseries.offsets.DateOffset(years=1)+ pd.tseries.offsets.DateOffset(days=1, normalize = True)
else:
    range_min = range_max - pd.tseries.offsets.DateOffset(years=1)+ pd.tseries.offsets.MonthEnd(1) + pd.tseries.offsets.DateOffset(days=1, normalize = True)

然后我截取我的数据片段,现在按预期从 2014 年 10 月 1 日到 2015 年 9 月 2 日。 然后我制作日期列表!这是我正在努力解决的关键问题。

# take slice with required of data
df = df[(df['recvd_dttm'] >= range_min) & 
               (df['recvd_dttm'] <= range_max)]

#Make a date list in order to get the months to plot later on           
date_list = pd.DataFrame(index=pd.date_range(start = range_min, end = datetime.datetime.now(), freq='M'))
date_list = date_list.index.to_series().apply(lambda x: datetime.datetime.strftime(x, '%b %Y')).tolist()            

这可能是我的范围有问题,是这样的:

range_min
Out[5]: Timestamp('2014-10-01 00:00:00')

range_max
Out[6]: datetime.datetime(2015, 9, 2, 10, 53, 24, 66000)

但第一个 date_list 命令输出如下:

pd.DataFrame(index=pd.date_range(start = range_min, end = datetime.datetime.now(), freq='M'))
Out[8]: 
Empty DataFrame
Columns: []
Index: [2014-10-31 00:00:00, 2014-11-30 00:00:00, 2014-12-31 00:00:00, 2015-01-31 00:00:00, 2015-02-28 00:00:00, 2015-03-31 00:00:00, 2015-04-30 00:00:00, 2015-05-31 00:00:00, 2015-06-30 00:00:00, 2015-07-31 00:00:00, 2015-08-31 00:00:00]

其中不包括 2015-09 ,所以我的 date_list 截止到 9 月。不知道为什么会这样。另外,如果有人知道创建此列表的更简单方法,请随时将其包括在内!

谢谢!

【问题讨论】:

你在开头提到的这个字符串列表就是你需要的一切?还是您使用 pandas 是因为您想在数据框上使用该列表? @swenzel 好问题。我稍后将 date_list 分配给另一个数据框中的列。我不完全确定是否需要熊猫。 【参考方案1】:

我认为你的问题是 freq='M' 今天回滚到 08/31。您可以查看 pd.tseries.offsets.Month 并查看使用前滚方法。我过去也这样做过。

另一种解决方案是构建完整的天数列表,并将其强制转换为月度周期。这有点骇人听闻,但应该将您推向正确的方向:

pd.date_range(start = range_min, end = datetime.datetime.now()).to_period('M').unique()

然后从该列表中取出最后 12 个(因为它返回 13) 我认为最终不需要唯一性。

【讨论】:

【参考方案2】:

您可以在不使用 pandas 的情况下列出过去一年的月份。

date_list=[datetime.date.today()- dateutil.relativedelta.relativedelta(months = x) for x in range(11,-1,-1)]
month_list=[datetime.date.strftime(x,'%b %Y') for x in date_list]

如果需要,您可以将上述列表转换为以月份为索引的 pandas 日期框架。

month_list=pd.DataFrame(index=month_list)

【讨论】:

以上是关于在 Pandas 中列出月份和年份的主要内容,如果未能解决你的问题,请参考以下文章

Python 实战基础Pandas如何给股票数据新增年份和月份

在Python中存储没有年份的日期和月份

如何在两个日期之间将所有年份、月份显示为 int?

如何从熊猫数据框中提取日期/年份/月份?

如何按月份和年份输入过滤具有日期时间索引的数据框?熊猫

在数据库中,如果只需要年份和月份,您会使用日期字段还是年份和月份字段?