Подход, использующий pandas.DataFrame.shift
( документы ).
Сначала я создам кадр данных с некоторыми данными:
import pandas as pd
datelist = pd.date_range('1/1/2019', periods=100).tolist()
values = np.random.randint(1, 5, 100)
df = pd.DataFrame({'Date': datelist, 'Value': values})
df = df.set_index('Date')
df.head(10)
Date Value
2019-01-01 1
2019-01-02 4
2019-01-03 2
2019-01-04 2
2019-01-05 2
2019-01-06 3
2019-01-07 2
2019-01-08 2
2019-01-09 3
2019-01-10 2
Удаляем непрерывно повторяющиеся строки:
df = df.loc[df.Value.shift() != df.Value]
Date Value
2019-01-01 2
2019-01-02 1
2019-01-04 2
2019-01-05 3
2019-01-06 1
Сброс индекса (если столбец Date
является индексом в исходных данных):
df = df.reset_index()
Переименуйте существующие столбцы в начальные столбцы.
df.columns = ['Start_Date', 'Start_Value']
Создание конечных столбцов путем смещения начальных столбцов назад на одну строку.
df['End_Date'] = df.Start_Date.shift(-1)
df['End_Value'] = df.Start_Value.shift(-1)
Удаление NaN (последняя строка кадра данных из-за shift(-1)
.
df = df.dropna()
Установите тип End_Value
на int
(если предпочитаете).
df['End_Value'] = df['End_Value'].astype(int)
df.head(10)
Start_Date Start_Value End_Date End_Value
0 2019-01-01 1 2019-01-02 4
1 2019-01-02 4 2019-01-03 2
2 2019-01-03 2 2019-01-06 3
3 2019-01-06 3 2019-01-07 2
4 2019-01-07 2 2019-01-09 3
5 2019-01-09 3 2019-01-10 2
6 2019-01-10 2 2019-01-11 1
7 2019-01-11 1 2019-01-12 2
8 2019-01-12 2 2019-01-15 1
9 2019-01-15 1 2019-01-16 4
Создайте файл CSV из фрейма данных:
df.to_csv('trends.csv')