Panda Datetimes: получить диапазоны даты и времени из списков datetime - PullRequest
0 голосов
/ 25 января 2020

Не уверен, если уместно, но даты в списке DatetimeIndex (?) В Panda, Python 3.6

Я пытаюсь получить все диапазоны дат последовательных дней, выводя минимум и максимум указанных диапазонов дат.

Выходные данные предпочли быть в списке, но кажется, что Dataframe - это, по сути, список, в котором я могу использовать индексирование, я думаю?
Я бы позже вывел эти диапазоны дат на лист Excel.

Пример ввода:

'1990-10-01', '1990-10-02', '1990-10-03', '1990-10-05', '2002-10-05', '2002-10-06'  

Ожидаемый результат:

1990-10-01, 1990-10-03  
1990-10-05   
2002-10-05, 2002-10-06    

Я знаю, что наивным методом было бы сделать для l oop и проверить, являются ли следующие / предыдущие даты выключить по одному, проверяя день, месяц и год. Но как лучше это сделать?

Спасибо

Отредактировано, чтобы уточнить

Ответы [ 2 ]

0 голосов
/ 25 января 2020

Настройка:

df = pd.DataFrame()

df['Date'] =  pd.to_datetime(['1990-10-01', '1990-10-02', '1990-10-03', '1990-10-05', '2002-10-05', '2002-10-06'])

Решение:

Сначала рассчитайте текущий diff, создайте флаг, чтобы указать, должны ли даты быть в та же группа, затем группа и получить дату начала и окончания для этой группы. Набор используется для удаления даты окончания, если она совпадает с начальной.

(
    df.assign(DateDiff=(df.Date - df.Date.shift(1)).dt.days.fillna(0))
    .assign(Flag= lambda x: np.where(x.DateDiff==1, np.nan, range(len(x))))
    .assign(Flag=lambda x: x.Flag.ffill())
    .groupby(by='Flag').Date
    .apply(lambda x: set([x.iloc[0].date(), x.iloc[-1].date()]))
)

Flag
0.0    {1990-10-01, 1990-10-03}
3.0                {1990-10-05}
4.0    {2002-10-05, 2002-10-06}
Name: Date, dtype: object
0 голосов
/ 25 января 2020

Давайте создадим пример:

Ввод:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...