转置亚日尺度气候数据:5分钟步长降水数据格式转换需求
问题描述
我有一份CSV格式的5分钟步长降水数据,结构如下:
DateTime,PR00,PR05,PR10,PR15,PR20,PR25,PR30,PR35,PR40,PR45,PR50,PR55 12/31/2013 0:00,0,0.4,0.6,0,0,0,0,0,0,0.2,0.6,0 12/31/2013 1:00,0,0.4,0.4,0.2,0.6,0.6,1.2,0.4,0,0.2,0,0.4 12/31/2013 2:00,0,0,0,0,0,0,0,0,0,0,0,0 12/31/2013 3:00,0,0,0,0,0,0,0,0,0,0,0,0 12/31/2013 4:00,0,0.2,0,0,0,0,0,0.2,0,0,0,0 12/31/2013 5:00,0,0,0,0,0,0,0,0,0,0,0,0 12/31/2013 6:00,0,0,0,0,0,0,0,0,0,0,0,0
其中第一列为1小时步长的日期时间,其余列对应每小时内5分钟间隔的降水记录。需要将其转换为包含**日期时间(Date)和降水(Precip)**两列的DataFrame,目标格式示例如下:
Date,Precip 12/31/2013 0:00,0 12/31/2013 0:05,0.4 12/31/2013 0:10,0.6 12/31/2013 0:15,0 12/31/2013 0:20,0 12/31/2013 0:25,0 12/31/2013 0:30,0 12/31/2013 0:35,0 12/31/2013 0:40,0 12/31/2013 0:45,0.2 12/31/2013 0:50,0.6 12/31/2013 0:55,0 ...
解决方案
使用Pandas可快速完成数据格式转换,具体实现如下:
完整代码
import pandas as pd # 读取CSV文件并解析日期时间列 df = pd.read_csv('your_file.csv', parse_dates=['DateTime']) # 将宽表转为长表,拆分每小时内的5分钟降水记录 melted_df = df.melt(id_vars='DateTime', var_name='MinuteTag', value_name='Precip') # 从列名中提取分钟偏移量(如PR00→0分钟) melted_df['Minutes'] = melted_df['MinuteTag'].str.extract(r'(\d+)').astype(int) # 计算精确的5分钟时间戳 melted_df['Date'] = melted_df['DateTime'] + pd.to_timedelta(melted_df['Minutes'], unit='minutes') # 整理目标列并按时间排序 result_df = melted_df[['Date', 'Precip']].sort_values('Date').reset_index(drop=True) # 可选:将日期格式化为示例中的字符串样式 result_df['Date'] = result_df['Date'].dt.strftime('%m/%d/%Y %H:%M') # 查看转换结果 print(result_df.head(12))
代码说明
melt函数将原始宽表结构转为长表,把每一行的12个降水值拆分为独立行- 通过正则表达式从
PRxx列名中提取分钟数,结合pd.to_timedelta生成精确的5分钟时间偏移 - 最后筛选目标列并按时间排序,得到符合要求的DataFrame
如果需要导出为CSV文件,添加以下代码:
result_df.to_csv('converted_precip.csv', index=False)
内容的提问来源于stack exchange,提问作者Rancho
相关产品推荐
相关产品推荐

