将具有范围的字符串表示拆分为日期列表

split a string representation with ranges into a list of dates

我有这个 pandas 数据框列,其中包含时间范围 (02.07.2021 - 07.07.2021) 和单日 (04.08.2021) 作为列表。

Dates
'02.07.2021 - 07.07.2021 , 04.08.2021, 19.06.2021 - 21.06.2021'
'13.02.2021 - 15.02.2021 , 03.03.2021 '
NaN
NaN

我想要这个:

Dates
02.07.2021, 03.07.2021, 04.07.2021, 05.07.2021, 06.07.2021, 07.07.2021, 04.08.2021, 19.06.2021, 20.06.2021, 21.06.2021
13.02.2021, 14.02.2021, 15.02.2021, 03.03.2021
NaN
NaN

所以基本上我想要列表中每个时间范围内的每一天。

是否有 pandas 解决方案? (我试图用 range 和 iloc 来解决它,但这是完成这个“简单”任务的方法)。

奖励:日期应具有日期时间类型 (pd.to_datetime())

您可以使用列表理解:

pd.Series([[str(d.strftime('%d.%m.%Y'))
            for x in re.split('\s*,\s*', s)
            for d in (pd.date_range(*map(lambda d: pd.to_datetime(d, format='%d.%m.%Y'),
                                         x.split(' - ')),
                                    freq='D')
              if ' - ' in x else [pd.to_datetime(x.strip(), format='%d.%m.%Y')])]
            for s in df['Dates']])

输出:

0    [02.07.2021, 03.07.2021, 04.07.2021, 05.07.202...
1     [13.02.2021, 14.02.2021, 15.02.2021, 03.03.2021]
dtype: object

使用的输入:

d = ['02.07.2021 - 07.07.2021 , 04.08.2021, 19.06.2021 - 21.06.2021',
     '13.02.2021 - 15.02.2021 , 03.03.2021 ']
df = pd.DataFrame({'Dates': d})