如何将爬取的ERCOT JSON数据中分散的时间字段转换为时间戳并实现数据清理与CSV导出
处理ERCOT供需数据并导出为CSV的完整方案
嘿,刚好能帮你搞定这个需求!下面是一步步的实现方法,涵盖时间戳转换、清理冗余字段和导出CSV,直接就能用:
1. 先准备好需要的库
除了requests用来爬数据,我们还需要pandas来轻松处理数据格式,以及datetime来搞定时间转换:
import requests import pandas as pd from datetime import datetime, timedelta
2. 爬取数据并转成DataFrame
先把数据拉下来,转成Pandas的DataFrame结构,比直接操作字典方便太多:
# 拉取ERCOT的供需数据 r = requests.get('https://www.ercot.com/api/1/services/read/dashboards/todays-outlook.json?_=1645233254068') raw_data = r.json() # 转换成DataFrame df = pd.DataFrame(raw_data)
3. 把interval和hourEnding转成时间戳
ERCOT的时间字段设计有点特殊:hourEnding是24小时制的结束小时,interval是分钟数(0/5/10...55)。我们需要把这两个字段组合成完整的时间,再转成Unix时间戳:
# 这里默认数据是当天的,如果不是的话,可以从接口返回的其他字段提取日期 data_date = datetime.now().date() # 拼接出完整的datetime对象 df['full_time'] = df.apply(lambda row: datetime.combine( data_date, datetime.min.time() + timedelta(hours=row['hourEnding'], minutes=row['interval']) ), axis=1) # 转成秒级时间戳(要毫秒的话就乘1000再转int) df['timestamp'] = df['full_time'].apply(lambda x: int(x.timestamp())) # 用完临时的full_time字段就删掉 df = df.drop(columns=['full_time'])
4. 清理掉无用的字段
直接删掉dstFlag和forecast这两个不需要的列就行:
df = df.drop(columns=['dstFlag', 'forecast'])
5. 整理字段并导出CSV
最后只保留我们需要的timestamp、capacity、demand,然后导出成CSV文件:
# 调整列的顺序(可选,按你想要的顺序来) final_data = df[['timestamp', 'capacity', 'demand']] # 导出CSV,index=False是为了不把DataFrame的索引存进去 final_data.to_csv('ercot_supply_demand.csv', index=False)
完整可运行代码
把所有步骤整合到一起,直接复制就能跑:
import requests import pandas as pd from datetime import datetime, timedelta # 1. 爬取原始数据 r = requests.get('https://www.ercot.com/api/1/services/read/dashboards/todays-outlook.json?_=1645233254068') raw_data = r.json() # 2. 转换为DataFrame df = pd.DataFrame(raw_data) # 3. 转换时间字段为时间戳 data_date = datetime.now().date() df['full_time'] = df.apply(lambda row: datetime.combine( data_date, datetime.min.time() + timedelta(hours=row['hourEnding'], minutes=row['interval']) ), axis=1) df['timestamp'] = df['full_time'].apply(lambda x: int(x.timestamp())) df = df.drop(columns=['full_time']) # 4. 移除无用字段 df = df.drop(columns=['dstFlag', 'forecast']) # 5. 导出为CSV final_data = df[['timestamp', 'capacity', 'demand']] final_data.to_csv('ercot_supply_demand.csv', index=False) print("搞定啦!数据已经保存成ercot_supply_demand.csv文件~")
小提醒
- 日期问题:如果接口返回的不是当天的数据,你得检查下JSON里有没有日期相关的字段,比如有没有
date或者类似的键,用那个来替换datetime.now().date()更准确。 - 时间戳精度:如果需要毫秒级时间戳,把
int(x.timestamp())改成int(x.timestamp() * 1000)就行。
内容的提问来源于stack exchange,提问作者user18253105
相关产品推荐
相关产品推荐

