【问题标题】:Iterate over every quarter of the year在一年中的每个季度进行迭代
【发布时间】:2018-12-23 10:32:45
【问题描述】:

我正在尝试在一年中的每个季度进行迭代,这就是我目前所拥有的。

now = datetime.now()

first_day = datetime(year=now.year, month=1, day=1)
print("--",first_day)
hundredDaysLater = first_day - timedelta(days=100)

for dt in rrule.rrule(rrule.MONTHLY, dtstart=first_day, bymonthday=(31, -1), count=6, interval=3):
    print(dt.replace(day=1))
    print(dt)

输出

  -- 2018-01-01 00:00:00
    2018-01-01 00:00:00
    2018-01-31 00:00:00
    2018-04-01 00:00:00
    2018-04-30 00:00:00
    2018-07-01 00:00:00
    2018-07-31 00:00:00
    2018-10-01 00:00:00
    2018-10-31 00:00:00
    2019-01-01 00:00:00
    2019-01-31 00:00:00
    2019-04-01 00:00:00

现在我基本上需要得到这个输出

2018-01-01, 2018-03-31
2018-04-01, 2018-06-30
2018-07-01, 2018-09-30
2018-10-01, 2018-12-31

但是我需要倒数,而不是向前数。

【问题讨论】:

  • 由于您的“倒数”而更新您的预期输出

标签: python python-3.x datetime rrule


【解决方案1】:

使用relativedelta(来自dateutil 包):

>>> from dateutil.relativedelta import relativedelta                                                                                                                  
>>> from datetime import date 
>>> d = date(2019, 1, 1)                                                                                                                                              
>>> day = relativedelta(days=1)                                                                                                                                       
>>> quarter = relativedelta(months=3)                                                                                                                                 
>>> while True: 
...     print(d - day) 
...     print(d - quarter) 
...     d -= quarter 
...                                                                                                                                                                   
2018-12-31
2018-10-01
2018-09-30
2018-07-01
2018-06-30
2018-04-01
2018-03-31
2018-01-01
2017-12-31
2017-10-01
2017-09-30
2017-07-01
2017-06-30
2017-04-01
2017-03-31
...

【讨论】:

    【解决方案2】:

    pandas.date_range 函数的简短解决方案:

    In [708]: start_date = datetime.datetime(2018, 1, 1)
    
    In [709]: data = pd.date_range(start=start_date, periods=4, freq='QS-JAN').union(
                     pd.date_range(start=start_date, periods=4, freq='Q-DEC')).strftime('%Y-%m-%d')
    
    In [710]: for i in range(0, data.size, 2):
         ...:     print(data[i], data[i+1], sep=', ')
         ...:     
    2018-01-01, 2018-03-31
    2018-04-01, 2018-06-30
    2018-07-01, 2018-09-30
    2018-10-01, 2018-12-31
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 2022-01-13
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多