Display/return 使用 python 当前月份和年份的过去 12 和 24 个月

Display/return last 12 and 24 months with year from current month and year using python

我想制作一个函数,它将输入当前月份和当前年份,并给出过去 12 个月和 24 个月的输出,

例如,假设函数是 f,

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

这个函数会return两个两个输出

 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 中以最有效的方式做到这一点?

最有效的方法是避免自己进行日期运算,而使用 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

您可能会发现从函数返回 datetimes 比从整数返回更方便。从 datetime 中提取日期和月份很容易,格式化 更方便,您可能需要在某个时候将它们转回 datetimes无论如何。

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

#!/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])

你可以自己推导出两年的版本

函数:

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]

您可以使用“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。