You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按时间步合并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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:30:19