我正在尝试制作一个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-01到2015-09-02。 然后我制作日期清单!这是我正在努力的关键点。
# 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月份中断。不知道为什么会这样。此外,如果有人知道创建此列表的更简单方法,请随意添加!
谢谢!
答案 0 :(得分:2)
您可以在不使用大熊猫的情况下列出过去一年的月份。
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 dateframe,索引为月份。
month_list=pd.DataFrame(index=month_list)
答案 1 :(得分: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) 我认为最终不需要这种独特性。