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
。
您可能会发现从函数返回 datetime
s 比从整数返回更方便。从 datetime
中提取日期和月份很容易,格式化 更 更方便,您可能需要在某个时候将它们转回 datetime
s无论如何。
即使 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。
我想制作一个函数,它将输入当前月份和当前年份,并给出过去 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
。
您可能会发现从函数返回 datetime
s 比从整数返回更方便。从 datetime
中提取日期和月份很容易,格式化 更 更方便,您可能需要在某个时候将它们转回 datetime
s无论如何。
即使 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。