如何查询DataFrame中按站点分组后各组观测数据的时间范围
首先需要先做数据前置清洗:过滤掉end_time早于start_time的异常记录,以及观测值为空、不符合业务逻辑的无效数据,再进行时间范围统计。以下是两种常见场景的实现方案:
1. 关系型数据库(SQL)实现
假设表名为station_observation,统计语句如下:
SELECT station_id, MIN(start_time) AS `start`, MAX(end_time) AS `end`, (YEAR(MAX(end_time)) - YEAR(MIN(start_time)) + 1) AS `years`, DATEDIFF(MAX(end_time), MIN(start_time)) + 1 AS `days` FROM station_observation -- 过滤无效数据 WHERE end_time >= start_time AND observation IS NOT NULL -- 可根据业务规则补充其他观测值有效性判断条件,比如observation >=0 GROUP BY station_id ORDER BY station_id;
2. Python Pandas 实现
如果数据已读取为DataFrame对象(变量名df),处理代码如下:
import pandas as pd # 第一步:时间字段转日期格式,清洗无效数据 df['start_time'] = pd.to_datetime(df['start_time']) df['end_time'] = pd.to_datetime(df['end_time']) df_clean = df[(df['end_time'] >= df['start_time']) & (df['observation'].notna())] # 第二步:按站点分组统计时间范围 result = df_clean.groupby('station_id').agg( start=('start_time', 'min'), end=('end_time', 'max') ).reset_index() # 第三步:计算覆盖年数、天数 result['years'] = result['end'].dt.year - result['start'].dt.year + 1 result['days'] = (result['end'] - result['start']).dt.days + 1 # 输出结果可按需求调整格式,比如对齐后打印 print(result.to_markdown(index=False))
说明
你给出的示例输出里站点3的结束时间早于开始时间、天数为1,是因为原始示例数据存在明显的时间录入错误,清洗异常数据后即可得到符合逻辑的结果。
内容的提问来源于stack exchange,提问作者GeoBeez
相关产品推荐
相关产品推荐

