首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中从过去两年中随机选择一个月

在Python中从过去两年中随机选择一个月
EN

Stack Overflow用户
提问于 2018-06-17 11:03:34
回答 8查看 1.4K关注 0票数 4

我想在当前年份和2016年之间随机选择一个月份。这是我目前的,very朴素的解决方案

from random import choice
def get_month():
    return choice({'2018-06','2018-05','2018-04','2018-03'})

很明显,这个集合在未来会变得太大,那么实现这一目标的更好方法是什么呢?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2018-06-17 11:14:29

也许你可以有两个月和年的列表,因为,这些将是固定的。然后,您可以在每一个之间随机选择,并创建一个日期来返回。通过这种方式,我认为不需要生成所有不同的日期,也不需要存储在大列表中:

from random import choice
def get_month():
    months = list(range(1, 13)) # 12 months list
    year = list(range(2016, 2019)) # years list here
    val = '{}-{:02d}'.format(choice(year), choice(months))
    return val

get_month()

结果:

'2017-05'

更新

如果您选择的年份是本年度,如果存在不超过当前月份的限制,那么您可能需要使用if条件来生成月份列表,如下所示:

from random import choice
from datetime import datetime

def get_month():

    today = datetime.today() # get current date
    year = list(range(2016, today.year+1)) # list till current date year

    # randomly select year and create list of month based on year
    random_year = choice(year)

    # if current year then do not exceed than current month
    if random_year == today.year:
        months = list(range(1, today.month+1))
    else:
        # if year is not current year then it is less so can create 12 months list
        months = list(range(1, 13)) 

    val = '{}-{:02d}'.format(random_year, choice(months))

    return val
票数 5
EN

Stack Overflow用户

发布于 2018-06-17 11:15:24

您可以使用库pandasdate_range

choice(pd.date_range(start="2016-01-01", end="2018-01-01", freq='M'))

如果你想要到今天为止,你可以用startend参数替换任何合适的参数,例如

from dateutil.relativedelta import relativedelta
today = datetime.today()
two_years_ago = today - relativedelta(years=2)
choice(pd.date_range(start=two_years_ago, end=today, freq='M'))
票数 2
EN

Stack Overflow用户

发布于 2018-06-18 18:17:52

我希望我的代码能给你一些启发。

 import random
 import datetime

 def RandomMonth(st_year, st_month, ed_year, ed_month):
     """st_year, st_month and ed_year/month is int. """
     start_date = datetime.datetime(st_year, st_month, 1)
     end_date = datetime.datetime(ed_year, ed_month, 31)
     d_days = (end_date - start_date).days
     r_days = random.randint(0, ttl_days)
     r_date = start_date + datetime.timedelta(days = r_days)
     return r_date.strftime("%B/%Y")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50893325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档