мой фрейм данных выглядит следующим образом, и я хотел бы изменить его порядок, обновить и сохранить в 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 с и т. д.).
Я пробовал складывать, разбирать, поворачивать, но, возможно, чего-то не хватает. Я был бы признателен за ваше предложение. Спасибо.
Привет спасибо. Я обновил его. Местоположение (широта, долгота) также включается в данные, но индекс времени является наиболее важным.
У df
на вашем изображении несколько дат. Хотите ли вы сгруппировать все значения ws
и wd
для каждого временного шага независимо от даты, или временной шаг должен пересекать дни? Если вы не хотите группировать, но шаг времени сбрасывается для каждого дня, хотите ли вы добавить date
перед шагом времени? Независимо от ответа, добавьте обновленный желаемый результат в свой вопрос в виде текста и сделайте его фактическим желаемым результатом на основе образца текстового ввода.
Да, сгруппируйте все wd в одну строку для каждого временного шага. Один временной шаг составляет 1 час (3600 с), 24 строки для одного дня, а следующий день будет 25 ч, 26 ч (90 000 с, 93 600 с и т. д.). Я отредактировал желаемый результат. Пожалуйста, проверьте это и спасибо.
Преобразуйте столбец 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
Можете ли вы предоставить небольшие воспроизводимые данные?