разделить записи в фрейме в полночь - PullRequest
0 голосов
/ 14 мая 2018

У меня есть pandas dataframe, с Start и End datatime.

df=pd.DataFrame(data=pd.date_range('20100201', periods=10, freq='5h3min'),columns=['Start'])
df.loc[:,'End']=df.loc[:,'Start']+pd.Timedelta(4,'h')
Можно ожидать, что

Start и End будут внутренне отсортированы, но между последовательными рядами могут возникать пробелы / перекрытия.

Я хотел бы создать новый кадр данных с той разницей, что если строка содержит полночь (например, полночь содержится в [Start, End]), то строка затем разделяется на две части до и после полуночи пример:

 Start                 End
0 2010-02-01 00:00:00 2010-02-01 04:00:00
1 2010-02-01 05:03:00 2010-02-01 09:03:00
2 2010-02-01 10:06:00 2010-02-01 14:06:00
3 2010-02-01 15:09:00 2010-02-01 19:09:00
4 2010-02-01 20:12:00 2010-02-02 00:12:00
5 2010-02-02 01:15:00 2010-02-02 05:15:00

должно быть

Start                 End
    0 2010-02-01 00:00:00 2010-02-01 04:00:00
    1 2010-02-01 05:03:00 2010-02-01 09:03:00
    2 2010-02-01 10:06:00 2010-02-01 14:06:00
    3 2010-02-01 15:09:00 2010-02-01 19:09:00
    -----------------------------------------
    4 2010-02-01 20:12:00 2010-02-01 23:59:00
    5 2010-02-02 00:00:00 2010-02-02 00:12:00
    -----------------------------------------
    6 2010-02-02 01:15:00 2010-02-02 05:15:00

1 Ответ

0 голосов
/ 14 мая 2018

Вы можете объединить DataFrame новых пар, а затем стереть старые.

Сначала найдите сплиты:

splits = df[df.End.dt.date > df.Start.dt.date].copy()

Теперь объединяем и отбрасываем:

>>> pd.concat([
    df,
    pd.DataFrame({
        'Start': list(splits.Start) + list(splits.End.dt.floor(freq='1D')),
        'End': list(splits.Start.dt.ceil(freq='1D')) + list(splits.End)})
]).drop(splits.index).sort_values(by='Start')
    End Start
0   2010-02-01 04:00:00 2010-02-01 00:00:00
1   2010-02-01 09:03:00 2010-02-01 05:03:00
2   2010-02-01 14:06:00 2010-02-01 10:06:00
3   2010-02-01 19:09:00 2010-02-01 15:09:00
0   2010-02-02 00:00:00 2010-02-01 20:12:00
2   2010-02-02 00:12:00 2010-02-02 00:00:00
5   2010-02-02 05:15:00 2010-02-02 01:15:00
6   2010-02-02 10:18:00 2010-02-02 06:18:00
7   2010-02-02 15:21:00 2010-02-02 11:21:00
8   2010-02-02 20:24:00 2010-02-02 16:24:00
1   2010-02-03 00:00:00 2010-02-02 21:27:00
3   2010-02-03 01:27:00 2010-02-03 00:00:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...