Python 从包含两个日期的字符串的单元格创建日期列表

Python 从包含两个日期的字符串的单元格创建日期列表,python,pandas,datetime,date-range,Python,Pandas,Datetime,Date Range,我有一个看起来包含日期范围字符串的数据框,看起来像这样: winter easter pentecost summer 1 01.02. - 06.02. 31.03. - 10.04. 14.05.+25.05. 07.07. - 21.08. 现在我想生成一个列表,列出这些范围内的所有日期。对于每一行,是否有比执行以下操作更具python功能的解决方案: def add_years(d, years): "&

我有一个看起来包含日期范围字符串的数据框,看起来像这样:

  winter            easter          pentecost       summer
1 01.02. - 06.02.   31.03. - 10.04. 14.05.+25.05.   07.07. - 21.08.
现在我想生成一个列表,列出这些范围内的所有日期。对于每一行,是否有比执行以下操作更具python功能的解决方案:

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)
>>> print(df)
                                                  winter                                             easter                                   pentecost                                             summer
    0  [2010-02-01 00:00:00, 2010-02-02 00:00:00, 201...  [2010-03-31 00:00:00, 2010-04-01 00:00:00, 201...  [2010-05-14 00:00:00, 2010-05-25 00:00:00]  [2010-07-07 00:00:00, 2010-07-08 00:00:00, 201...

并将每列的值附加到一个列表中?正如您所看到的,有些列包含
+
而不是
-
,这意味着它不是一个范围,而是两天。此外,有时范围超过一年,例如
23.12。-01.01

您可以使用正则表达式来识别日期模式,并从中提取日期和月份值。将此代码放在一个函数中以应用于数据帧列,如下所示(注意我在2个案例中使用的
pat1
pat2
正则表达式):

然后,您可以将此函数应用于数据帧的所有列:

df['winter'] = df.winter.apply(parse_date_patterns)
df['easter'] = df.easter.apply(parse_date_patterns) 
df['pentecost'] = df.pentecost.apply(parse_date_patterns)
df['summer'] = df.summer.apply(parse_date_patterns)
您的数据框现在将在每一行中具有所需的日期列表:

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)
>>> print(df)
                                                  winter                                             easter                                   pentecost                                             summer
    0  [2010-02-01 00:00:00, 2010-02-02 00:00:00, 201...  [2010-03-31 00:00:00, 2010-04-01 00:00:00, 201...  [2010-05-14 00:00:00, 2010-05-25 00:00:00]  [2010-07-07 00:00:00, 2010-07-08 00:00:00, 201...

代码中的
winter\u from
winter\u to
列不在显示的数据框中。你怎么知道的?对不起,我忘了一行代码。我现在添加了它好的,对于
+
案例,您的日期列表应该只包含这两个日期,对吗?没错。我更新了我的方法,使它更清晰。我的df有几行,每行我需要一个列表添加答案,如果我在理解问题时遗漏了什么,请告诉我,我将相应地更新答案。不幸的是,我意识到数据中包含了更多的特殊情况,但您的答案解决了我的问题,因此我向上投票:)很高兴我能提供帮助:)