【问题标题】:Generate list of months between interval in python and print在python中生成间隔之间的月份列表并打印
【发布时间】:2021-01-18 22:39:33
【问题描述】:

我想生成一个python列表,其中包含两个日期之间发生的所有月份,在数组中按年份分隔,如下所示:

startdate = "2014-10-10"  # input start date
enddate = "2016-01-07"  # input end date
month_list = [['Oct-14', 'Nov-14', 'Dec-14'], ['Jan-15', 'Feb-15', 'Mar-15', 'Apr-15', 'May-15', 'Jun-15', 'Jul-15', 'Aug-15', 'Sep-15', 'Oct-15', 'Nov-15', 'Dec-15'], ['Jan-16']]  # output

我试过了,但它只在数组中显示两年间隔

import calendar
from datetime import *
startdate = datetime.strptime("2015-09-10", "%Y-%m-%d")
enddate = datetime.strptime("2016-5-15", "%Y-%m-%d")
month_str = calendar.month_name
curryear = startdate.year
months = []
yearss=[]
temp=[]
while startdate < enddate:
    month = startdate.month
    year = startdate.year
    day = startdate.day
    mon_str = month_str[month][0:3]
    next_month = month + 1 if month != 12 else 1
    if curryear == year:
        months.append("{0}-{1}".format(mon_str, str(year)[-2:]))
        startdate = startdate.replace(month=next_month, year=year)
    next_year = year+1 if next_month==1 else year
    if curryear != next_year:
        startdate = startdate.replace(month=next_month, year=next_year)
        temp.append("{0}-{1}".format(mon_str, str(next_year)[-2:]))
months.append(temp)
print(months)

输出: ['Sep-15','Oct-15','Nov-15','Dec-15',['Dec-16','Jan-16','Feb-16','Mar-16', '4 月 16 日','5 月 16 日']]

【问题讨论】:

    标签: python


    【解决方案1】:

    没有熊猫的解决方案。
    (您也可以在没有 dateutils 的情况下使用它)
    (但你必须手动计算月份)

    import datetime 
    from dateutil.relativedelta import relativedelta
    
    startdate = datetime.datetime.strptime("2014-10-10", "%Y-%m-%d")
    enddate = datetime.datetime.strptime("2016-01-07", "%Y-%m-%d")
    
    # truncate the dates
    startdate = startdate.replace(day=1)
    enddate = enddate.replace(day=1)
    
    # keep track of the series
    dates = []
    
    # create series by year
    dates_years = []
    current_year = startdate.year
    while startdate <= enddate:
        
        # if the current year is not equal to the value of startdate.year
        if startdate.year != current_year:
            
            # update current year
            current_year = startdate.year
            
            # add the dates_year to dates
            dates.append(dates_years)
            
            # empty dates_years
            dates_years = []
            
        # store the date in current year
        dates_years.append(startdate.strftime("%b-%y"))
        
        # add a month
        startdate += relativedelta(months=1)
        
    else:
        # add the last part
        if len(dates_years) > 0:
            dates.append(dates_years)
    

    结果:日期

    [['Oct-14', 'Nov-14', 'Dec-14'],
     ['Jan-15',
      'Feb-15',
      'Mar-15',
      'Apr-15',
      'May-15',
      'Jun-15',
      'Jul-15',
      'Aug-15',
      'Sep-15',
      'Oct-15',
      'Nov-15',
      'Dec-15'],
     ['Jan-16']]
    

    【讨论】:

      【解决方案2】:

      你可以通过 pandas 做到这一点:

      import numpy as np
      import pandas as pd
      import datetime
      from dateutil.relativedelta import relativedelta
      
      startdate = "2014-10-10"  # input start date
      enddate = "2016-01-07" 
      
      ## optionally - end date should be 1 + month, but date_range does also accept string-values
      # cast the dates
      startdate = datetime.date.fromisoformat(startdate)
      enddate = datetime.date.fromisoformat(enddate) + relativedelta(months=1) # add 1 month
      
      # convert to a data frame
      dtr = pd.date_range(start=startdate, end=enddate, freq="M")
      

      结果

      DatetimeIndex(['2014-10-31', '2014-11-30', '2014-12-31', '2015-01-31',
                     '2015-02-28', '2015-03-31', '2015-04-30', '2015-05-31',
                     '2015-06-30', '2015-07-31', '2015-08-31', '2015-09-30',
                     '2015-10-31', '2015-11-30', '2015-12-31', '2016-01-31'],
                    dtype='datetime64[ns]', freq='M')
      

      第 2 步:

      df = pd.DataFrame(dtr, columns=["dates"])
      df['year'] = df.dates.dt.year
      
      # add the result
      df['output'] = [x.strftime("%b-%y") for x in df.dates]
      

      结果

          dates       year    output
      0   2014-10-31  2014    Oct-14
      1   2014-11-30  2014    Nov-14
      2   2014-12-31  2014    Dec-14
      3   2015-01-31  2015    Jan-15
      4   2015-02-28  2015    Feb-15
      5   2015-03-31  2015    Mar-15
      6   2015-04-30  2015    Apr-15
      7   2015-05-31  2015    May-15
      8   2015-06-30  2015    Jun-15
      9   2015-07-31  2015    Jul-15
      10  2015-08-31  2015    Aug-15
      11  2015-09-30  2015    Sep-15
      12  2015-10-31  2015    Oct-15
      13  2015-11-30  2015    Nov-15
      14  2015-12-31  2015    Dec-15
      15  2016-01-31  2016    Jan-16
      

      第三步

      按年份分组,并将日期添加到列表中:

      [list(output) for year, output in df.groupby('year').output]
      
      结果
      [['Oct-14', 'Nov-14', 'Dec-14'],
       ['Jan-15',
        'Feb-15',
        'Mar-15',
        'Apr-15',
        'May-15',
        'Jun-15',
        'Jul-15',
        'Aug-15',
        'Sep-15',
        'Oct-15',
        'Nov-15',
        'Dec-15'],
       ['Jan-16']]
      

      【讨论】:

      • 可以不用额外的包(pandas)来完成
      • @bungaloarch - 可能
      • @bungaloarch 我会尽快更新答案
      • 嗨,你得到答案了吗
      猜你喜欢
      • 1970-01-01
      • 2012-05-28
      • 2013-03-04
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多