【问题标题】:how to generate a range of yyyymm values? [duplicate]如何生成一系列 yyyymm 值? [复制]
【发布时间】:2015-01-20 09:54:07
【问题描述】:

我有两个将由用户输入的 yyyymm 值:

yyyymm_1 = '201406'
yyyymm_2 = '201501'

我希望能够以递增的月份顺序遍历此范围:

for yyyy and mm in the range of yyyymm_1 to yyyymm_2
    my_function( yyyy, mm )

这在 python 中如何实现?


更新:

理想情况下,解决方案应该尽可能简单,无需外部库。我不是在寻找一个通用的日期处理解决方案,而是一个回答我上面提出的具体问题的解决方案。

在发布我的问题之前,我已经看到了很多通用解决方案。但是,作为一个 python 菜鸟,看不到如何使它们适应我的问题:

关于这一点,从该页面链接到的其他问题更为通用。如果您希望生成一系列 yyyymm 值,我强烈建议您查看此页面上的选定答案。

【问题讨论】:

  • 你尝试了什么?顺便说一句,不到 2 天前弹出了一个question similar to this one。您是否根据关键字搜索过类似的问题?
  • 这个问题和选择的答案与其他问题和答案明显不同。这个问题专门询问如何从 yyyy mm 日期范围生成一组 yyyy 和 mm 值。我找不到任何与此问题相同的问题。
  • 在我看来它们几乎一样,克里斯。你会说它们有什么不同?
  • 有不同的抽象级别。我正在使用 yyyymm 值,而其他问题大多处于 yyyymmdd 级别。有些问题允许您提供一个区间值,例如天,但是当您有几个月的天数不同时,这并不容易翻译。一种解决方案使用似乎不支持月份的 datetime.timedelta:docs.python.org/2/library/datetime.html#datetime.datetime

标签: python


【解决方案1】:

这是另一个相当简单的变体,甚至没有使用datetime。只需拆分日期,计算“总月”,然后迭代。

def to_month(yyyymm):
    y, m = int(yyyymm[:4]), int(yyyymm[4:])
    return y * 12 + m

def iter_months(start, end):
    for month in range(to_month(start), to_month(end) + 1):
        y, m = divmod(month-1, 12)  # ugly fix to compensate
        yield y, m + 1              # for 12 % 12 == 0

for y, m in iter_months('201406', '201501'):
    print y, m

输出:

2014 6
2014 7
...
2014 12
2015 1

要以相同的yyyymm 格式输出,请使用print("%d%02d" % (y, m))

【讨论】:

  • 这个解决方案的月份是从零开始的,怎么可能是从一开始的呢?
  • @ChrisSnow 哎呀,你是对的,我错过了。现在应该修好了。
【解决方案2】:

您可以使用内置的datetime 模块和第三方包dateutil 来做到这一点。

代码首先使用datetime.datetime.strptime 将您的字符串转换为datetime.datetime 对象。然后它使用来自dateutilrelativedelta 函数创建一个可以添加到您的日期时间的一个月的时间段。

while 循环中,您可以直接使用datetime 对象,也可以使用strftime 将月份和年份构造为字符串,我已经在打印函数中展示了两者的示例。

import datetime as dt
from dateutil.relativedelta import relativedelta

yyyymm_1 = '201406'
yyyymm_2 = '201501'

MONTH = relativedelta(months=+1)

fmt = '%Y%m'
date_1 = dt.datetime.strptime(yyyymm_1, fmt).date()
date_2 = dt.datetime.strptime(yyyymm_2, fmt).date()

d = date_1

while d <= date_2:
    print(d)
    print(d.strftime('%Y'), d.strftime('%m'))

    d += MONTH

【讨论】:

    猜你喜欢
    • 2014-03-12
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多