1. 数据加载与缓存机制
-
数据来源与结构:
- 数据文件为
"stations/slim.csv.gz"
,包含了所有气象站的基本信息,如站点 ID、名称、国家、经纬度、海拔、时区、以及数据观测的起止时间(小时、日、月级数据)。 _columns
列表定义了原始数据中的所有字段,_types
字典则规定了各字段的类型转换要求,而_parse_dates
列表指定了需要解析为日期类型的字段索引。
- 数据文件为
-
加载逻辑:
- 在初始化时(
__init__
方法),会调用内部的_load
方法来加载数据。 _load
方法先通过get_local_file_path
确定缓存文件的本地路径,并利用file_in_cache
检查该缓存是否仍在有效期内(依据max_age
参数)。- 如果缓存有效,则直接从本地使用
pd.read_pickle
载入数据;否则,通过load_handler
从 Meteostat 的远程服务器下载数据,并在下载后将数据保存成 Pickle 格式到缓存中,以便下次快速加载。
- 在初始化时(
2. 数据存储与基本结构
-
数据存储:
- 所有的气象站数据存储在实例变量
_data
中,类型为pandas.DataFrame
。数据加载后,会将"id"
列设置为索引,便于后续查找和筛选。
- 所有的气象站数据存储在实例变量
-
继承与模块化:
- 该类继承自
Base
类,并整合了多个内部模块和工具函数(例如:缓存相关的clear_cache
、地理距离计算函数get_distance
等),使得功能扩展更为灵活和模块化。
- 该类继承自
3. 筛选与排序方法
① nearby(lat, lon, radius=None)
- 功能: 根据给定的经纬度计算每个气象站与指定点的距离,并对数据进行排序。
- 实现:
- 使用
get_distance
函数计算每个站点与目标点之间的地理距离。 - 如果提供了
radius
参数,则仅保留距离小于等于此半径的站点。 - 返回一个新的 Stations 类实例,其中
_data
为筛选后的 DataFrame,且数据按距离从近到远排序。
- 使用
② region(country, state=None)
- 功能: 根据国家代码以及可选的地区/州代码筛选气象站。
- 实现:
- 首先根据国家代码过滤数据。
- 如果提供
state
参数,则进一步过滤出特定地区的站点。
③ bounds(top_left, bottom_right)
- 功能: 根据地理边界(左上角和右下角坐标)筛选站点。
- 实现:
- 根据纬度和经度的范围条件,选出位于该矩形区域内的所有站点。
④ inventory(freq, required=True | datetime | tuple)
- 功能: 根据数据观测的时间范围筛选气象站,确保站点具有指定频率(如 "hourly"、"daily"、"monthly")的数据记录。
- 实现:
- 当
required
为True
时,仅筛选出具有该频率数据记录的站点。 - 如果
required
为一个元组,则判断站点数据的起止时间是否覆盖给定的时间段。 - 如果
required
是一个具体的日期,则确保该站点在此日期有有效数据。
- 当
⑤ convert(units)
- 功能: 对选定的数据进行单位转换。
- 实现:
- 接收一个字典,字典键为需要转换的列名,值为转换函数(例如:从英制转换到公制)。
- 对应列的数据将应用该转换函数,生成新的数据集。
4. 数据统计与提取
① count()
- 功能: 返回当前筛选条件下气象站的数量。
- 实现:
- 利用 DataFrame 的索引长度,直接返回站点数量。
② fetch(limit=None, sample=False)
- 功能: 提取筛选后的完整数据或部分数据。
- 实现:
- 如果同时提供
limit
和sample=True
,则随机抽样返回指定数量的行。 - 如果仅提供
limit
,则返回前几条记录。 - 如果不提供限制,则返回整个 DataFrame。
- 如果同时提供
5. 实例复制与方法链式调用
- 复制机制:
- 在每个筛选方法(如
nearby
、region
、bounds
、inventory
、convert
)中,都会首先对当前实例进行浅复制(copy(self)
),然后在新复制的实例上操作。这种设计可以保证每次筛选操作不会修改原始数据,而是返回一个新的筛选结果,支持方法链式调用。
- 在每个筛选方法(如
Stations 类提供了一个灵活且高效的接口,用于:
- 加载和缓存全球气象观测站数据,
- 根据地理位置(距离、区域、边界)筛选站点,
- 根据数据记录的时间范围过滤站点,
- 对数据进行单位转换,
- 并最终统计和提取符合条件的站点数据。