【问题标题】:Pandas: Generate date intervals between two dates with yearly resetPandas:生成两个日期之间的日期间隔并每年重置
【发布时间】:2022-01-14 18:14:56
【问题描述】:

我正在尝试使用pandas.date_range 在两个时间段之间生成 8 天的间隔。此外,当 8 天的间隔超过年底(即 365/366)时,我希望范围开始重置为相应年份的年初。以下是仅使用两年的示例代码,但我确实计划在几年内使用它,例如 2014-01-01 到 2021-01-01。

import pandas as pd

print(pd.date_range(start='2018-12-01', end='2019-01-31', freq='8D'))

结果,

DatetimeIndex(['2018-12-01', '2018-12-09', '2018-12-17', '2018-12-25','2019-01-02', '2019-01-10', '2019-01-18', '2019-01-26'], dtype='datetime64[ns]', freq='8D')

但是,我希望将 2019 年的间隔开始重置为第一天,例如,2019-01-01

【问题讨论】:

    标签: python pandas date-range


    【解决方案1】:

    您可以为每一年循环创建一个直到下一年开始的 date_range,并将它们附加到结束日期为止。

    import pandas as pd
    from datetime import date
    
    def date_range_with_resets(start, end, freq):
      start = date.fromisoformat(start)
      end = date.fromisoformat(end)
      result = pd.date_range(start=start, end=start, freq=freq) # initialize result with just start date
      next_year_start = start.replace(year=start.year+1, month=1, day=1)
      while next_year_start < end:
        result = result.append(pd.date_range(start=start, end=next_year_start, freq=freq))
        start = next_year_start
        next_year_start = next_year_start.replace(year=next_year_start.year+1)
      result = result.append(pd.date_range(start=start, end=end, freq=freq))
      return result[1:] # remove duplicate start date
    
    start = '2018-12-01'
    end = '2019-01-31'
    date_range_with_resets(start, end, freq='8D')
    

    编辑: 这是一种不使用日期时间的更简单的方法。在开始和结束之间创建一个 date_range 年份,然后遍历它们。

    def date_range_with_resets(start, end, freq):
      years = pd.date_range(start=start, end=end, freq='YS') # YS=year start
      if len(years) == 0:
        return pd.date_range(start=start, end=end, freq=freq)
      result = pd.date_range(start=start, end=years[0], freq=freq)
      for i in range(0, len(years) - 1):
        result = result.append(pd.date_range(start=years[i], end=years[i+1], freq=freq))
      result = result.append(pd.date_range(start=years[-1], end=end, freq=freq))
      return result
    

    【讨论】:

    • 谢谢!我喜欢循环几年的第二种选择。
    猜你喜欢
    • 2021-09-28
    • 2015-08-06
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    相关资源
    最近更新 更多