【问题标题】:Pandas date_range starting from the end date to start datePandas date_range 从结束日期到开始日期
【发布时间】:2016-02-17 04:14:59
【问题描述】:

我正在尝试使用 Python 生成一系列半年度日期。 Pandas 提供了一个函数 pd.date_range 来帮助解决这个问题,但是我希望我的日期范围从结束日期开始并向后迭代。

例如给定输入:

start = datetime.datetime(2016 ,2, 8)
end = datetime.datetime(2018 , 6, 1)
pd.date_range(start, end, freq='6m')

结果是:

DatetimeIndex(['2016-02-29', '2016-08-31', '2017-02-28', '2017-08-31',
               '2018-02-28'])

如何生成以下内容:

DatetimeIndex(['2016-02-08', '2016-06-01', '2016-12-01', '2017-06-01',
               '2017-12-01', '2018-06-01'])

【问题讨论】:

  • 删除了我最初的答案。我认为这里主要是偏移量,对吗?
  • @Maximilian 是的,这是另一种说法。

标签: python datetime pandas


【解决方案1】:

使用更新后的输出(来自您所做的编辑),您可以执行以下操作:

from pandas.tseries.offsets import DateOffset

end = datetime.datetime(2018 , 6, 1)
start = datetime.datetime(2016 ,2, 8)
#Get the range of months to cover
months = (end.year - start.year)*12 + end.month - start.month
#The frequency of periods
period = 6 # in months

pd.DatetimeIndex([end - DateOffset(months=e) for e in range(0, months, period)][::-1]).insert(0, start)

这是一个相当简洁的解决方案,虽然我没有比较运行时,所以我不确定它有多快。

基本上这只是将您需要的日期创建为列表,然后将其转换为日期时间索引。

【讨论】:

    【解决方案2】:

    这可以在没有 pandas 的情况下使用 datutil 来完成。然而,它比它可能应该涉及的更多:

    from datetime import date
    import math
    from dateutil.relativedelta import relativedelta
    
    #set up key dates
    start = date(2016 ,2, 8)
    end = date(2018 , 6, 1)
    
    #calculate date range and number of 6 month periods
    daterange = end-start
    periods = daterange.days *2//365
    
    #calculate next date in sequence and check for year roll-over
    next_date = date(start.year,math.ceil(start.month/6)*6,1)
    if next_date < start: next_date = date(next_date.year+1,next_date.month,1)
    
    #add the first two values to a list
    arr = [start.isoformat(),next_date.isoformat()]
    
    #calculate all subsequent dates using 'relativedelta'
    for i in range(periods):
        next_date = next_date+ relativedelta(months=+6)
        arr.append(next_date.isoformat())
    
    
    #display results
    print(arr)
    

    【讨论】:

    • 我在next_date = 行收到错误TypeError: integer argument expected, got float
    • @pyCthon next_date 是哪一行?第一个还是 for 循环中的那个?如果是后者,那么可能是您没有安装 dateutil,我应该提到这一点。
    • 第一个,安装了dateutil,我有'2.4.2'
    • 啊好吧尝试使用整数除法,即 start.month//6
    猜你喜欢
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 2022-01-23
    相关资源
    最近更新 更多