使用python从当前月份和年份显示/返回年份的最后12和24个月

时间:2019-04-18 08:08:26

标签: python python-3.x pandas python-datetime

我想创建一个函数,该函数将输入当前月份和当前年份,并给出带有年份的最近12个月和24个月的输出,

例如,假设函数为f,

 f(4,2019) # 4 is the current month and 2019 is the current year

此函数将返回两个两个输出

 first output:
 [3,2,1,12,11,10,9,8,7,6,5,4]  # last 12 months from current month i.e. 4

 [2019,2019,2019,2018,2018,2018,2018,2018,2018,2018,2018,2018] 
  # the years of corresponding months

second output:
[3,2,1,12,11,10,9,8,7,6,5,4,3,2,1,12,11,10,9,8,7,6,5,4] # last 24 months

[2019,2019,2019,2018,2018,2018,2018,2018,2018,2018,2018,2018,
2018,2018,2018,2017,2017,2017,2017,2017,2017,2017,2017,2017]  
# years of above months

如何在python中以最有效的方式做到这一点?

4 个答案:

答案 0 :(得分:1)

最有效的方法是避免自己进行日期算术,并使用dateutil为您完成日期计算。

>>> from dateutil import parser, relativedelta
>>> d = parser.parse('2019-04-01')
>>> d
datetime.datetime(2019, 4, 1, 0, 0)
>>> previous = [d - relativedelta.relativedelta(months=m) for m in range(1,13)]
>>> previous
[datetime.datetime(2019, 3, 1, 0, 0), datetime.datetime(2019, 2, 1, 0, 0),
 datetime.datetime(2019, 1, 1, 0, 0), datetime.datetime(2018, 12, 1, 0, 0), 
 datetime.datetime(2018, 11, 1, 0, 0), datetime.datetime(2018, 10, 1, 0, 0), 
 datetime.datetime(2018, 9, 1, 0, 0), datetime.datetime(2018, 8, 1, 0, 0), 
 datetime.datetime(2018, 7, 1, 0, 0), datetime.datetime(2018, 6, 1, 0, 0), 
 datetime.datetime(2018, 5, 1, 0, 0), datetime.datetime(2018, 4, 1, 0, 0)]

要获得24个月而不是12个月的时间,请用列表理解中的25代替13

您可能会发现,从函数中返回datetime比整数更方便。从datetime中提取日期和月份很容易,格式化更方便了 ,而且您可能有时还是必须将它们转换回datetime。 / p>

答案 1 :(得分:0)

即使stackoverflow实际上不是代码编写服务...也应该这样做:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def f(month, year):
  m=range(12, 0, -1)*3
  y=[year]*12+[year-1]*12
  return m[13-month:(13-month+12)], y[13-month:(13-month+12)]


print f(4, 2019)

输出为:

([3, 2, 1, 12, 11, 10, 9, 8, 7, 6, 5, 4], [2019, 2019, 2019, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018])

您可以自己从该版本中获得两年的版本。

答案 2 :(得分:0)

功能:

import datetime

import dateutil.relativedelta

def get_prev_month_date(year, month, period):

    years, months = ([] for j in range(2))
    for i in range(1, period+ 1):
        date = datetime.date(year, month, 3)
        months.append((date - dateutil.relativedelta.relativedelta(months=i)).month)
        years.append((date - dateutil.relativedelta.relativedelta(months=i)).year)
    return years, months

代码:

years_list, months_list = get_prev_month_date(2019, 4, 12)

结果:

[2019, 2019, 2019, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018]
[3, 2, 1, 12, 11, 10, 9, 8, 7, 6, 5, 4]

答案 3 :(得分:0)

您可以使用`Pandas'库设置今天的日期以及您之前的目标月份。

import pandas as pd

today = pd.to_datetime('today').strftime("%d/%m/%Y")
last = (pd.to_datetime(today) - pd.DateOffset(years=1)).strftime("%d/%m/%Y")

listofmonths = pd.date_range(start=last, end=today, freq='MS') 

如果要获得24个月的服务,请将years设置为2。