如何用Python和Pandas处理特殊结构的电力使用Excel数据?
处理特殊结构电力数据的最优Python策略(Jupyter Notebook)
首先,你的思路完全正确——将数据转换为datetime + 功率值的长格式时间序列,是后续聚合、筛选和与气象数据对比分析的关键。手动循环行列确实没必要,Pandas内置的重塑方法就能高效完成这个转换,而且处理几百行数据完全不在话下。下面是具体的步骤和最优实践:
一、读取并筛选有效数据行
你的文件里100/200行是元数据(电表标识、单位、时间间隔等),真正的用电数据在300开头的行里。首先用Pandas读取文件,然后筛选出这些有效行:
import pandas as pd # 读取Excel文件,无表头所以设置header=None df = pd.read_excel('your_electricity_data.xlsx', header=None) # 筛选300开头的行,复制避免链式索引警告 data_rows = df[df[0] == 300].copy().reset_index(drop=True)
二、将宽格式数据重塑为长格式时间序列
300行的结构是:日期 + 96个15分钟时段的用电数据 + 质量标识。我们需要把这96列的宽格式数据转成每行对应一个时间点的长格式,这里用melt方法(Pandas核心内置函数,比循环高效N倍):
- 先处理日期列,转成标准datetime对象:
# 将第二列(索引1)的数字日期转成datetime,格式为YYYYMMDD data_rows['base_date'] = pd.to_datetime(data_rows[1], format='%Y%m%d')
- 生成15分钟间隔的时间偏移量,匹配96个时段:
# 生成从00:00到23:45的15分钟间隔,共96个时间点 time_offsets = pd.timedelta_range(start='00:00', end='23:45', freq='15min')
- 用
melt重塑数据,并合并日期与时间偏移得到完整datetime:
# 提取96个用电数据列(从第2列到倒数第2列,最后一列是质量标识) value_columns = data_rows.columns[2:-1] # 重塑数据:把96列转成行 melted_data = data_rows.melt( id_vars=['base_date', data_rows.columns[-1]], # 保留日期和质量标识 value_vars=value_columns, var_name='interval_col', value_name='power_kWh' ) # 给每个时段列匹配对应的时间偏移 melted_data['time_offset'] = melted_data['interval_col'].map(dict(zip(value_columns, time_offsets))) # 合并日期和时间偏移,得到完整的datetime melted_data['datetime'] = melted_data['base_date'] + melted_data['time_offset'] # 整理最终的时间序列DataFrame,按需保留列 final_time_series = melted_data[['datetime', 'power_kWh', data_rows.columns[-1]]].sort_values('datetime').reset_index(drop=True)
这样你就得到了一个整洁的时间序列,每行对应一个15分钟的用电数据点,包含完整的datetime、功率值和数据质量标识。
三、关于“无需转换直接分析”的可行性
老实说,不转换的话很难高效完成你想要的对比分析:
- 气象数据通常是长格式(每行一个时间点),和你当前的宽格式用电数据无法直接关联合并;
- 宽格式数据做时间维度的聚合(比如按小时/天统计平均功率)、可视化(比如绘制用电趋势)都会非常繁琐;
- 后续的建模(比如预测用电需求)也几乎都要求输入长格式的时间序列数据。
所以转换是必要的,而且用Pandas的内置方法完全是低成本、高效率的操作,没必要纠结跳过这一步。
四、后续分析与可视化示例
转换完成后,和气象数据合并、分析就非常简单了。假设你有一个包含datetime和temperature的气象数据DataFrame,合并后可以快速做相关性分析或可视化:
import seaborn as sns import matplotlib.pyplot as plt # 合并用电数据和气象数据 merged_df = pd.merge(final_time_series, weather_data_df, on='datetime') # 绘制用电功率与温度的双轴折线图 plt.figure(figsize=(14, 6)) ax1 = plt.gca() sns.lineplot(data=merged_df, x='datetime', y='power_kWh', color='blue', ax=ax1) ax1.set_ylabel('Power Usage (kWh)') ax1.set_xlabel('Datetime') ax2 = ax1.twinx() sns.lineplot(data=merged_df, x='datetime', y='temperature', color='red', ax=ax2) ax2.set_ylabel('Temperature (°C)') plt.title('Power Usage vs. Temperature Over Time') plt.show()
总结
- 用Pandas的
melt方法是处理这类宽格式转长格式问题的最优解,避免手动循环,代码简洁且性能优异; - 转换后的时间序列结构是后续分析、建模和可视化的标准格式,能无缝对接气象数据;
- 不要试图跳过转换步骤,否则会给后续操作带来大量不必要的麻烦。
内容的提问来源于stack exchange,提问作者Suitangi
相关产品推荐
相关产品推荐

