如何按时间步合并DataFrame的ws/wd列并转换时间为秒数?
DataFrame重排与时间转换解决方案
原始数据
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
期望输出
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
实现步骤及代码
1. 导入依赖并加载数据
import pandas as pd # 加载数据(如果是从CSV读取,替换为pd.read_csv("your_file.csv")) data = [ ["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 = pd.DataFrame(data, columns=["time", "lat", "lon", "ws", "wd"])
2. 转换时间并计算秒数
将原始时间转为datetime类型,再计算每个时间点相对于起始时间的秒数:
# 转换time列为datetime格式 df["time"] = pd.to_datetime(df["time"], format="%m/%d/%Y %H:%M") # 计算起始时间,生成以秒为单位的时间步 start_time = df["time"].min() df["time_sec"] = (df["time"] - start_time).dt.total_seconds().astype(int)
3. 为同时间条目添加分组索引
给每个时间组内的记录分配序号,用于后续展开列:
df["group_idx"] = df.groupby("time_sec").cumcount()
4. 重塑数据并调整格式
使用pivot方法将同一时间的ws、wd展开到同一行:
# 按时间秒数和分组索引重塑数据 pivoted = df.pivot(index="time_sec", columns="group_idx", values=["ws", "wd"]) # 调整列名,匹配期望输出的重复ws/wd格式 pivoted.columns = [col[0] for col in pivoted.columns] # 重置索引,让time_sec成为普通列 result = pivoted.reset_index().rename(columns={"time_sec": "time"})
5. 保存结果到CSV
result.to_csv("processed_data.csv", index=False)
补充说明
- 若要避免重复列名(pandas默认允许但可能引发后续操作问题),可将列名改为
ws_0、wd_0、ws_1格式,修改列名赋值语句即可:pivoted.columns = [f"{col[0]}_{col[1]}" for col in pivoted.columns] - 针对大规模数据,直接用
pd.read_csv读取原始文件效率更高,无需手动构造DataFrame。
内容的提问来源于stack exchange,提问作者tok
相关产品推荐
相关产品推荐

