You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 14:27:05