如何从指定CSV文件中获取小时粒度的数据?
提取CSV中的小时粒度数据方案
嘿,我来帮你搞定这个小时粒度数据提取的问题!你的CSV数据里既有仅含时间戳的空值行,也有带数值的有效记录,咱们用Python工具来处理最省心,下面分两种常用方法给你演示:
方法一:用Pandas(推荐,适合大数据量)
Pandas是处理时间序列数据的神器,几步就能完成聚合:
步骤1:读取并预处理CSV
首先导入Pandas,然后读取你的CSV文件,解析时间戳并处理时区:
import pandas as pd # 读取CSV,指定列名,自动解析时间戳 df = pd.read_csv( 'your_file.csv', names=['timestamp', 'value1', 'value2'], parse_dates=['timestamp'], infer_datetime_format=True ) # 确保时间戳带时区(如果你的数据里有时区标识,Pandas会自动识别) df['timestamp'] = pd.to_datetime(df['timestamp'], utc=True) # 可选:过滤掉value1和value2都为空的无效行 df = df.dropna(subset=['value1', 'value2'], how='all')
步骤2:按小时聚合数据
把时间戳设为索引,然后用resample按小时重采样,你可以根据需求选择聚合方式(均值、求和、第一个值等):
# 设置时间戳为索引 df = df.set_index('timestamp') # 按小时取均值(替换成sum()/first()/max()可实现其他聚合逻辑) hourly_data = df.resample('H').mean() # 查看结果 print(hourly_data)
如果你的CSV行是用空格分隔的(从你提供的内容看可能存在格式问题),只需要在read_csv里加上sep='\s+'参数即可正确解析。
方法二:纯Python实现(适合小数据量)
如果不想用第三方库,用标准库也能实现:
import csv from collections import defaultdict from datetime import datetime # 用字典存储每个小时的数值列表 hourly_groups = defaultdict(lambda: {'value1': [], 'value2': []}) with open('your_file.csv', 'r') as f: reader = csv.reader(f) for row in reader: if len(row) < 3: continue # 跳过无效行 ts_str, v1, v2 = row # 解析时间戳并截断到小时 timestamp = datetime.fromisoformat(ts_str) hour_key = timestamp.replace(minute=0, second=0, microsecond=0) # 添加有效数值 if v1.strip(): hourly_groups[hour_key]['value1'].append(float(v1)) if v2.strip(): hourly_groups[hour_key]['value2'].append(float(v2)) # 计算每个小时的均值 hourly_result = {} for hour, values in hourly_groups.items(): avg_v1 = sum(values['value1']) / len(values['value1']) if values['value1'] else None avg_v2 = sum(values['value2']) / len(values['value2']) if values['value2'] else None hourly_result[hour] = {'value1': avg_v1, 'value2': avg_v2} # 输出结果 for hour, data in hourly_result.items(): print(f"{hour}: value1={data['value1']:.2f}, value2={data['value2']:.2f}")
两种方法都能帮你得到按小时粒度聚合的数据,根据你的数据量和需求选就行~
内容的提问来源于stack exchange,提问作者Souvik Ray
相关产品推荐
相关产品推荐

