Создание столбцов из сгруппированных выходных данныхPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Создание столбцов из сгруппированных выходных данных

Сообщение Anonymous »

У меня есть данные, которые выглядят следующим образом
startDate endDate value sourceName
0 2024-06-03 22:26:00+02:00 2024-06-03 22:46:00+02:00 HKCategoryValueSleepAnalysisAsleepCore AppleWatch
6 2024-06-03 22:40:00+02:00 2024-06-04 07:48:00+02:00 HKCategoryValueSleepAnalysisAsleepCore Connect
1 2024-06-03 22:46:00+02:00 2024-06-03 22:49:00+02:00 HKCategoryValueSleepAnalysisAwake AppleWatch
2 2024-06-03 22:49:00+02:00 2024-06-04 00:56:00+02:00 HKCategoryValueSleepAnalysisAsleepREM AppleWatch
3 2024-06-04 00:56:00+02:00 2024-06-04 03:56:00+02:00 HKCategoryValueSleepAnalysisAsleepCore AppleWatch
4 2024-06-04 05:56:00+02:00 2024-06-04 07:56:00+02:00 HKCategoryValueSleepAnalysisAsleepREM AppleWatch
5 2024-06-04 22:40:00+02:00 2024-06-05 07:48:00+02:00 HKCategoryValueSleepAnalysisAsleepCore AppleWatch

Я группирую их в «сеансы сна» по устройству и дате начала и окончания, если промежуток не превышает 2 часов.
startDate endDate duration
sourceName
AppleWatch 0 2024-06-03 22:26:00+02:00 2024-06-04 07:56:00+02:00 7.500000
1 2024-06-04 22:40:00+02:00 2024-06-05 07:48:00+02:00 9.133333
Connect 1 2024-06-03 22:40:00+02:00 2024-06-04 07:48:00+02:00 9.133333

Я хотел бы получить столбцы, в которых суммируется продолжительность каждого сгруппированного значения (внутри сеанса). пример
REM_duration
Core_duration
Awake_duration

Кроме того, любые промежутки между этапами (см. между индексами строк 3 и 4) следует добавлять в Awake_duration. Пример Awake_duration из сеанса 0 должен быть 2,05
Поэтому ожидаемый результат будет
startDate endDate duration sourceName rem_duration core_duration awake_duration
0 2024-06-03 22:26:00+02:00 2024-06-04 07:56:00+02:00 7.500000 AppleWatch 4.116667 3.333333 2.05
1 2024-06-04 22:40:00+02:00 2024-06-05 07:48:00+02:00 9.133333 AppleWatch 0.000000 9.133333 0.00
1 2024-06-03 22:40:00+02:00 2024-06-04 07:48:00+02:00 8.133333 Connect 1.000000 7.133333 1.00

Это то, что у меня есть на данный момент
import pandas as pd
from datetime import timedelta

data = [
{
"startDate": pd.Timestamp("2024-06-03 22:26:00+0200"),
"endDate": pd.Timestamp("2024-06-03 22:46:00+0200"),
"value": "HKCategoryValueSleepAnalysisAsleepCore",
"sourceName": "AppleWatch"
},
{
"startDate": pd.Timestamp("2024-06-03 22:46:00+0200"),
"endDate": pd.Timestamp("2024-06-03 22:49:00+0200"),
"value": "HKCategoryValueSleepAnalysisAwake",
"sourceName": "AppleWatch"
},
{
"startDate": pd.Timestamp("2024-06-03 22:49:00+0200"),
"endDate": pd.Timestamp("2024-06-04 00:56:00+0200"),
"value": "HKCategoryValueSleepAnalysisAsleepREM",
"sourceName": "AppleWatch"
},
{
"startDate": pd.Timestamp("2024-06-04 00:56:00+0200"),
"endDate": pd.Timestamp("2024-06-04 03:56:00+0200"),
"value": "HKCategoryValueSleepAnalysisAsleepCore",
"sourceName": "AppleWatch"
},
{
"startDate": pd.Timestamp("2024-06-04 05:56:00+0200"),
"endDate": pd.Timestamp("2024-06-04 07:56:00+0200"),
"value": "HKCategoryValueSleepAnalysisAsleepREM",
"sourceName": "AppleWatch"
},
{
"startDate": pd.Timestamp("2024-06-04 22:40:00+0200"),
"endDate": pd.Timestamp("2024-06-05 07:48:00+0200"),
"value": "HKCategoryValueSleepAnalysisAsleepCore",
"sourceName": "AppleWatch"
},
{
"startDate": pd.Timestamp("2024-06-03 22:40:00+0200"),
"endDate": pd.Timestamp("2024-06-04 07:48:00+0200"),
"value": "HKCategoryValueSleepAnalysisAsleepCore",
"sourceName": "Connect"
}
]

# Create DataFrame
df_orig = pd.DataFrame.from_records(data).sort_values('startDate')
max_gap = 2

df = df_orig.copy()

df = df.sort_values(['sourceName', 'startDate'])

df['duration'] = (df['endDate'] - df['startDate']).div(pd.Timedelta(hours=1))

g = df['startDate'].sub(df['endDate'].shift()).div(pd.Timedelta(hours=1))
df2 = df.groupby(['sourceName', g.gt(max_gap).cumsum()]).agg({'startDate':'min', 'endDate':'max', 'duration': 'sum'})


Подробнее здесь: https://stackoverflow.com/questions/788 ... ped-output
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»