无法使用Pandas按时间范围分组温度读数问题求助
解决温度数据按分钟/小时分组的问题
嘿,我来帮你搞定这个温度数据分组的问题!你现在的情况是分组后还是列出了每分钟的所有记录,核心问题是只做了分组操作,但没有对每组的温度数据做聚合统计(比如取平均值、最大值、最小值),所以才会把每条原始记录都列出来。下面给你两种实用的解决方法:
方法一:用Pandas快速处理(推荐)
Pandas对时间序列分组的支持非常友好,几步就能搞定:
读取数据并转为DataFrame
不管你用TinyDB还是直接读取JSON文件,先把数据转成Pandas的DataFrame格式:from tinydb import TinyDB import pandas as pd # 用TinyDB读取数据 db = TinyDB('tinydb_environment.json') df = pd.DataFrame(db.all()) # 或者直接读取JSON文件(如果不用TinyDB的话) # import json # with open('tinydb_environment.json', 'r') as f: # data = json.load(f) # df = pd.DataFrame(data)转换日期时间格式
先把字符串类型的date_time转为Pandas能识别的datetime对象,这是正确分组的前提:df['date_time'] = pd.to_datetime(df['date_time'])按分钟/小时分组并聚合
现在就可以按时间维度分组,同时对tempC做聚合统计了。比如:- 按分钟分组,计算每分钟的平均温度:
minute_avg_temp = df.groupby(df['date_time'].dt.floor('min'))['tempC'].mean().reset_index() print(minute_avg_temp) - 按小时分组,同时计算平均、最高、最低温度:
hour_temp_stats = df.groupby(df['date_time'].dt.floor('h'))['tempC'].agg(['mean', 'max', 'min']).reset_index() print(hour_temp_stats)
- 按分钟分组,计算每分钟的平均温度:
方法二:纯Python代码处理
如果不想用Pandas,用基础的Python库也能实现:
import json from datetime import datetime # 读取JSON数据 with open('tinydb_environment.json', 'r') as f: data = json.load(f) # 初始化字典存储分组数据,键是分钟级时间,值是该分钟的温度列表 minute_groups = {} for item in data: # 解析日期时间字符串 dt = datetime.fromisoformat(item['date_time']) # 把时间精确到分钟(秒和微秒置0)作为分组键 minute_key = dt.replace(second=0, microsecond=0) temp = item['tempC'] # 把温度加入对应分组 if minute_key not in minute_groups: minute_groups[minute_key] = [] minute_groups[minute_key].append(temp) # 计算每组的平均温度并按时间排序 sorted_minute_avg = sorted( [(key, sum(values)/len(values)) for key, values in minute_groups.items()], key=lambda x: x[0] ) # 打印结果 for dt, avg_temp in sorted_minute_avg: print(f"{dt.strftime('%Y-%m-%d %H:%M')}: {avg_temp:.2f}°C")
关键提醒
- 一定要先把
date_time字符串转为datetime对象,不然没法正确提取分钟/小时维度的时间键; - 分组后必须做聚合操作(比如
mean()、agg()),不然得到的只是分组后的原始记录集合,而不是你想要的每个时间单位的汇总数据。
内容的提问来源于stack exchange,提问作者justdata
相关产品推荐
相关产品推荐

