将SYNOP TAC消息或SYNOP文件转换为BUFR4。
项目描述
synop2bufr
synop2bufr Python模块包含一个命令行界面和API,可以将存储在SYNOP或TAC文本文件中的数据转换为WMO BUFR数据格式。有关BUFR格式的更多信息,请参阅WMO《代码手册》第一卷。2。
安装
要求
依赖项
依赖项列在requirements.txt中。依赖项在安装synop2bufr时自动安装。
设置环境变量
在使用synop2bufr之前,我们强烈建议您设置BUFR_ORIGINATING_CENTRE
和BUFR_ORIGINATING_SUBCENTRE
环境变量。这些变量用于指定SYNOP消息的起源中心和子中心。**如果没有设置,它们将默认为缺失(65535)**。
您可以在您的shell中设置这些环境变量,以便在本地机器上运行synop2bufr。以下是您如何在Bash shell中这样做的方法:
export BUFR_ORIGINATING_CENTRE=<centre_value>
export BUFR_ORIGINATING_SUBCENTRE=<subcentre_value>
运行
要从Docker容器中运行synop2bufr
docker run -it -v /$(pwd):/local wmoim/dim_eccodes_baseimage:2.34.0 bash
cd /local
python3 setup.py install
synop2bufr --help
示例数据可以在data
目录中找到,相应的参考BUFR4在data/bufr
中。
将SYNOP数据文件转换为BUFR
mkdir output-data
synop2bufr data transform --metadata data/station_list.csv --year 2023 --month 03 --output-dir output-data data/A_SMRO01YRBK211200_C_EDZW_20220321120500_12524785.txt
要在Amazon Web Services的Lambda函数内部运行synop2bufr,请参阅aws-lambda/README.md,并使用此Dockerfile构建Lambda函数的容器镜像。
API使用指南
在此,我们详细说明如何在Python中使用synop2bufr API。
首先,假设我们有一些SYNOP数据。
注意:无论这些SYNOP数据是否为本地目录中的文本文件或字符串,只要消息遵循SYNOP规定即可。
在Python文件中,我们可以通过以下方式导入synop2bufr的模块
from synop2bufr import method_name
其中,method_name
是以下模块提供的以下方法的占位符
方法 | 描述 |
---|---|
transform |
将所有SYNOP数据转换为多个BUFR4文件。 |
parse_synop |
将单个SYNOP tac字符串转换为Python字典对象。 |
extract_individual_synop |
从单个字符串中提取和重新格式化单个SYNOP消息。 |
file_extract |
从单个文本文件中提取和重新格式化单个SYNOP消息。 |
转换为BUFR
可以使用以下方式使用to_bufr
方法
to_bufr(synop_message)
其中,如前所述,输入可以是tac字符串本身或包含SYNOP数据的文本文件的目录。
此方法在名为output-bufr的文件夹中生成BUFR4文件。生成的BUFR4文件数量与输入的SYNOP消息数量相等。
示例
假设我们有一个名为A_SMRO01YRBK211200_C_EDZW_20220321120500_12524785.txt
的文本文件,其中包含2023年1月的23个SYNOP报告,以及相应的站元数据"station_list.csv"
。我们可以使用以下代码将这些转换为23个BUFR4文件
from synop2bufr import transform
transform(data = "A_SMRO01YRBK211200_C_EDZW_20220321120500_12524785.txt", metadata = "station_list.csv", year = 2023, month = 1)
注意:必须运行Python文件在Docker容器中,而不是在您的物理机器上!
转换为Python字典
synop2bufr提供了两种方法来获取在转换为BUFR之前SYNOP消息的Python字典。
其中最简单的是parse_synop
。可以使用以下方式使用它
parse_synop(single_synop_message, year, month)
其中,SYNOP消息必须是字符串,而年份/月份必须是整数。这返回一个包含单个解码消息的Python字典的数组,以及检测到的第3部分和第4部分云组的数量[^1]。
[^1]: 这些是SYNOP消息第3部分和第4部分的复制云组。有关详细信息,请参阅WMO FM-12手册。
注意:对于此方法,必须省略SYNOP消息的终止字符
=
。
示例
假设我们有以下SYNOP消息
AAXX 21121
15015 02999 02501 10103 21090 39765 42952 57020 60001=
15020 02997 23104 10130 21075 30177 40377 58020 60001 81041=
我们可以使用parse_synop
解码其中一个消息,例如前者,如下所示
from synop2bufr import parse_synop
message = "AAXX 21121 15001 05515 32931 10103 21090 39765 42250 57020 60001"
parse_synop(data = message, year = 2023, month = 1)
它返回(格式化后的)
[
{
"report_type": "AAXX",
"year": 2023,
"month": 1,
"day": 21,
"hour": 12,
"minute": 0,
"wind_indicator": 8,
"block_no": "15",
"station_no": "015",
"station_id": "15015",
"region": null,
"WMO_station_type": 1,
"lowest_cloud_base": null,
"visibility": 50000,
"cloud_cover": 0,
"time_significance": 2,
"wind_time_period": -10,
"wind_direction": 250,
"wind_speed": 1,
"air_temperature": 283.45,
"dewpoint_temperature": 264.15,
"relative_humidity": 24.799534703795413,
"station_pressure": null,
"isobaric_surface": null,
"geopotential_height": null,
"sea_level_pressure": null,
"3hr_pressure_change": null,
"pressure_tendency_characteristic": 15,
"precipitation_s1": null,
"ps1_time_period": null,
"present_weather": 511,
"past_weather_1": 31,
"past_weather_2": 31,
"past_weather_time_period": -6,
"cloud_vs_s1": 62,
"cloud_amount_s1": 0,
"low_cloud_type": 30,
"middle_cloud_type": 20,
"high_cloud_type": 10,
"maximum_temperature": null,
"minimum_temperature": null,
"ground_state": null,
"ground_temperature": null,
"snow_depth": null,
"evapotranspiration": null,
"evaporation_instrument": null,
"temperature_change": null,
"tc_time_period": null,
"sunshine_amount_1hr": null,
"sunshine_amount_24hr": null,
"low_cloud_drift_direction": null,
"low_cloud_drift_vs": null,
"middle_cloud_drift_direction": null,
"middle_cloud_drift_vs": null,
"high_cloud_drift_direction": null,
"high_cloud_drift_vs": null,
"e_cloud_genus": null,
"e_cloud_direction": null,
"e_cloud_elevation": null,
"24hr_pressure_change": null,
"net_radiation_1hr": null,
"net_radiation_24hr": null,
"global_solar_radiation_1hr": null,
"global_solar_radiation_24hr": null,
"diffuse_solar_radiation_1hr": null,
"diffuse_solar_radiation_24hr": null,
"long_wave_radiation_1hr": null,
"long_wave_radiation_24hr": null,
"short_wave_radiation_1hr": null,
"short_wave_radiation_24hr": null,
"net_short_wave_radiation_1hr": null,
"net_short_wave_radiation_24hr": null,
"direct_solar_radiation_1hr": null,
"direct_solar_radiation_24hr": null,
"precipitation_s3": null,
"ps3_time_period": null,
"precipitation_24h": null,
"highest_gust_1": null,
"highest_gust_2": null,
"hg2_time_period": -360
},
0,
0
]
注意:返回的字典始终具有相同的键,这意味着通常有许多null项,因为这些组不存在于SYNOP消息中。
注意2:由于示例消息不包含第3部分和第4部分组,因此检测到的此类云组数量为0。
消息提取
synop2bufr提供的其余两个方法相对简单,不太可能被使用。这些是extract_individual_synop
和file_extract
,如上所述,它们用于提取准备转换为Python字典和随后转换为BUFR4文件的字符串。
可以使用以下方式使用extract_individual_synop
extract_individual_synop(SYNOP message string)
它返回一个字符串数组,其中每个字符串都是一个单个SYNOP消息(例如,准备好使用convert_to_dict
)。
可以使用以下方式使用file_extract
file_extract(SYNOP message text file directory)
该方法返回与extract_individual_synop
相同的结果,前提是提供了文件内容以及由文件名确定的年份和月份。
发布
# create release (x.y.z is the release version)
vi synop2bufr/__init__.py # update __version__
git commit -am 'update release version vx.y.z'
git push origin main
git tag -a vx.y.z -m 'tagging release version vx.y.z'
git push --tags
# upload to PyPI
rm -fr build dist *.egg-info
python setup.py sdist bdist_wheel --universal
twine upload dist/*
# publish release on GitHub (https://github.com/wmo-im/synop2bufr/releases/new)
# bump version back to dev
vi synop2bufr/__init__.py # update __version__
git commit -am 'back to dev'
git push origin main
文档
关于synop2bufr的完整文档可以在https://synop2bufr.readthedocs.io找到,包括示例文件。
代码约定
错误和问题
所有错误、增强和问题都在GitHub上管理。
联系
项目详情
下载文件
下载您平台对应的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源分发
构建分发
synop2bufr-0.7.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9c6cdd46f0b7fe9388233a533ff53dd06c9fe5c5bf416f8569be5b742f6159a0 |
|
MD5 | db7a38979230ca160fff166eca29a5b0 |
|
BLAKE2b-256 | df6444bdfecc47dd13bbeeff25e174762d08160adb1cf58e1765f0ebd694fd66 |
synop2bufr-0.7.0-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 52a09110ef385b040d88b7e2a21290113057e011140494ba542ab3531fa3a476 |
|
MD5 | ba93792ea3cf06307126b808da417438 |
|
BLAKE2b-256 | 7dd151ddee497c4d7fb78a0adadb2dcfa38e68507ed284d7e829f0f13ba6f9bb |