Отображение / возврат последних 12 и 24 месяцев с указанием года от текущего месяца и года с использованием Python - PullRequest
0 голосов
/ 18 апреля 2019

Я хочу сделать одну функцию, которая будет принимать данные текущего месяца и текущего года и будет выдавать выходные данные за последние 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 ]

1 голос
/ 18 апреля 2019

Самый эффективный способ - избегать арифметики даты самостоятельно и использовать 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 s обратно из вашей функции, а не целые числа.Из datetime легко извлечь дату и месяц, форматирование на намного удобнее, и вам, вероятно, придется в любом случае превратить их в datetime s.

0 голосов
/ 18 апреля 2019

Вы можете использовать библиотеку `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.

0 голосов
/ 18 апреля 2019

Функция:

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]
0 голосов
/ 18 апреля 2019

Даже если на самом деле 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])

Вы можете получить версию длядва года от себя.

...