Давайте создадим пример:
Ввод:
l = ['1990-10-01', '1990-10-02', '1990-10-03', '1990-10-05', '2002-10-05', '2002-10-06']
idx = pd.DatetimeIndex(l)
DatetimeIndex(['1990-10-01', '1990-10-02', '1990-10-03', '1990-10-05',
'2002-10-05', '2002-10-06'],
dtype='datetime64[ns]', freq=None)
Решение:
Создайте вспомогательный ряд, который вычислит difference
между последовательными датами и создаст группы, где разница не равна 1, затем l oop по группам и получит первый и последний элемент в этой группы.
g = idx.to_series().diff().fillna(pd.Timedelta(days=1)).dt.days.ne(1).cumsum()
final = [pd.DatetimeIndex(map(grp.index.__getitem__, (0,-1)))
if len(grp.index)>1 else grp.index
for _,grp in g.groupby(g)]
Выходные данные:
[DatetimeIndex(['1990-10-01', '1990-10-03'], dtype='datetime64[ns]', freq=None),
DatetimeIndex(['1990-10-05'], dtype='datetime64[ns]', freq=None),
DatetimeIndex(['2002-10-05', '2002-10-06'], dtype='datetime64[ns]', freq=None)]
Если вы хотите, чтобы кадр данных выполнял df.to_excel(..)
, просто создайте кадр данных на основе final
список:
df = pd.DataFrame(final,columns = ['start','end'])
print(df)
start end
0 1990-10-01 1990-10-03
1 1990-10-05 NaT
2 2002-10-05 2002-10-06