【发布时间】:2021-05-17 12:01:52
【问题描述】:
我有一个包含日期范围字符串的数据框,看起来像这样:
winter easter pentecost summer
1 01.02. - 06.02. 31.03. - 10.04. 14.05.+25.05. 07.07. - 21.08.
现在我想生成这些范围内所有日期的列表。是否有比为每一行执行以下操作更 Pythonic 的解决方案:
def add_years(d, years):
"""
credits: https://stackoverflow.com/a/15743908/12934163
"""
try:
return d.replace(year = d.year + years)
except ValueError:
return d + (date(d.year + years, 1, 1) - date(d.year, 1, 1))
holidays_list = []
for col in holidays.columns:
if holidays[col].str.contains('\+', na=True).values[0]:
days_list = holidays[col].values[0].split('+')
date_strings = [s + '2010' for s in days_list]
holidays_list.extend([datetime.strptime(date, "%d.%m.%Y").date() for date in date_strings])
else:
days_list = holidays[col].str.split('-',1).tolist()
days_list = [x.strip(' ') for x in days_list[0]]
date_strings = [s + '2010' for s in days_list]
date_dates = [datetime.strptime(date, "%d.%m.%Y").date() for date in date_strings]
if date_dates[0] > date_dates[1]:
date_dates[1] = add_years(date_dates[1],1)
dates_between = list(pd.date_range(date_dates[0],date_dates[1],freq='d'))
ferien_liste.extend(dates_between)
并将每一列的值附加到一个列表中?如您所见,某些列包含+ 而不是-,这意味着它不是一个范围,而是两天。此外,有时范围超过一年,比如23.12. - 01.01
【问题讨论】:
-
winter_from和winter_to代码中的列不在您显示的数据框中。你是怎么知道的? -
对不起,我忘记了一行代码。我现在添加了它
-
好的,对于
+的情况,您的日期列表应该只有这两个日期吧? -
完全正确。我更新了我的方法以使其更清晰。我的 df 有几行,我需要每行一个列表
-
添加了答案,如果我在理解问题时遗漏了什么,请告诉我,我会相应地更新答案
标签: python pandas datetime date-range