Объедините столбцы по строкам для каждого временного шага

мой фрейм данных выглядит следующим образом, и я хотел бы изменить его порядок, обновить и сохранить в csv или аналогичном формате.

 time         lat   lon    ws        wd
1/1/2023 0:00 -5    107    8.214895  313.9049
1/1/2023 0:00 -5    107.25 8.351197  314.44873
1/1/2023 0:00 -5.25 107    7.6247864 307.61456

1/1/2023 1:00 -5    107    8.084728  310.0435
1/1/2023 1:00 -5    107.25 8.091071  308.73547
1/1/2023 1:00 -5.25 107    7.4219675 302.27475

1/1/2023 2:00 -5    107.25 7.8656287 304.08533
1/1/2023 2:00 -5    107.5  8.087259  300.91684
1/1/2023 2:00 -5.25 107    7.4953856 300.94644

Желаемый df:

time  ws        wd        ws       wd        ws        wd
0     8.214895  313.9049  8.351197 314.44873 7.6247864 307.61456
3600  8.084728  310.0435  8.091071 308.73547 7.4219675 302.27475
7200  7.8656287 304.08533 8.087259 300.91684 7.4953856 300.94644

Сгруппируйте все ws wd в одну строку для каждого временного шага. Один временной шаг составляет 1 час (3600 с), 24 строки для одного дня, а следующий день будет 25 ч, 26 ч (90 000 с, 93 600 с и т. д.).

Я пробовал складывать, разбирать, поворачивать, но, возможно, чего-то не хватает. Я был бы признателен за ваше предложение. Спасибо.

Можете ли вы предоставить небольшие воспроизводимые данные?

Shane S 23.05.2024 00:08

Привет спасибо. Я обновил его. Местоположение (широта, долгота) также включается в данные, но индекс времени является наиболее важным.

tok 23.05.2024 03:46

У df на вашем изображении несколько дат. Хотите ли вы сгруппировать все значения ws и wd для каждого временного шага независимо от даты, или временной шаг должен пересекать дни? Если вы не хотите группировать, но шаг времени сбрасывается для каждого дня, хотите ли вы добавить date перед шагом времени? Независимо от ответа, добавьте обновленный желаемый результат в свой вопрос в виде текста и сделайте его фактическим желаемым результатом на основе образца текстового ввода.

ouroboros1 23.05.2024 11:15

Да, сгруппируйте все wd в одну строку для каждого временного шага. Один временной шаг составляет 1 час (3600 с), 24 строки для одного дня, а следующий день будет 25 ч, 26 ч (90 000 с, 93 600 с и т. д.). Я отредактировал желаемый результат. Пожалуйста, проверьте это и спасибо.

tok 23.05.2024 13:20
1
4
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Преобразуйте столбец time в дату и время и вычтите минимальное значение для дельт времени, для секунд используйте Series.dt.total_секунды , затем создайте счетчик с помощью GroupBy.cumcount и сведите с помощью DataFrame.pivot, последний вывод сортировки с помощью Flatten MultiIndex для предотвращения дублирования имен столбцов:

times = pd.to_datetime(df['time'])
df['time'] = times.sub(times.min()).dt.total_seconds().astype(int)

out = (df.assign(g = df.groupby('time').cumcount())
        .pivot(index='time', values=['ws','wd'], columns='g')
        .sort_index(level=[1, 0], axis=1, ascending=[True, False]))

out.columns = out.columns.map(lambda x: f'{x[0]}_{x[1]}')
print (out)
          ws_0       wd_0      ws_1       wd_1      ws_2       wd_2
time                                                               
0     8.214895  313.90490  8.351197  314.44873  7.624786  307.61456
3600  8.084728  310.04350  8.091071  308.73547  7.421968  302.27475
7200  7.865629  304.08533  8.087259  300.91684  7.495386  300.94644

Другие вопросы по теме