Pandas: 生成两个日期之间的日期间隔,每年重置
Pandas: Generate date intervals between two dates with yearly reset
我正在尝试使用 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
您可以循环创建一个 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
我正在尝试使用 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
您可以循环创建一个 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