参考:https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html
以下是chatgpt翻译:
5.6 常用配置变量
5.6.1 时间控制
本节介绍用于控制处理时间的 METplus wrapper 配置变量,同时涵盖了基于运行时钟时间设置运行时间以便实时处理数据的功能。
5.6.1.1 循环方式 (LOOP_BY)
METplus wrapper 可以配置为在一组有效时间(valid time)或初始化时间(initialization time)上循环。通过名为 LOOP_BY 的配置变量进行控制。当该变量的值设置为 INIT 或 RETRO 时,循环将基于初始化时间;当值设置为 VALID 或 REALTIME 时,循环将基于有效时间。
5.6.1.2 按Valid Time有效时间循环
在按有效时间循环(LOOP_BY = VALID 或 REALTIME)时,必须设置以下变量:
-
VALID_TIME_FMT
- 定义用户可在 METplus wrapper 中配置的有效时间格式。
- 例如:
格式示例:VALID_TIME_FMT = %Y%m%d%H
2019020112
表示 2019 年 2 月 1 日 12 时。
-
VALID_BEG
- 指定要处理的第一个有效时间,与
VALID_TIME_FMT
格式一致。
- 指定要处理的第一个有效时间,与
-
VALID_END
- 指定可处理的最后一个有效时间,与
VALID_TIME_FMT
格式一致。
- 指定可处理的最后一个有效时间,与
注意:该变量指定的时间未必会被处理,而是用于决定运行时间的截止点。为此变量指定的时间不一定会被处理。它用于确定可以处理的运行时间的截止值。例如,如果METplus Wrappers配置开始为20190201,结束为20190202,增量为48小时,它将处理有效时间20190201,然后将运行时间增加到20190203, 这晚于VALID_END值,因此执行将停止。但是,如果增量设置为24小时(请参阅VALID_INCREMENT),则METplus Wrappers将在结束执行之前处理有效时间20190201和20190202。
-
VALID_INCREMENT
- 指定每个运行时间的增量,用于计算下一个运行时间。单位为秒,最小支持 60 秒。
示例配置:
[config] LOOP_BY = VALID VALID_TIME_FMT = %Y%m%d%H VALID_BEG = 2019020100 VALID_END = 2019020200 VALID_INCREMENT = 6H
此配置将处理从 2019 年 2 月 1 日 00Z 到 2019 年 2 月 2 日 00Z,每 6 小时(21600 秒)递增。
对于每个有效的时间,METplus wappers还将循环访问在当前运行时间均有效的一组预测线索。有关详细信息,请参阅Looping over Forecast Leads。
VALID_LIST
如果运行时的间隔是不规则的,可以显式定义时间。下面是一个例子
[config] LOOP_BY = VALID VALID_TIME_FMT = %Y%m%d%H VALID_LIST = 2019020100, 2019020106, 2019020112, 2019020118, 2019020200
更多信息,参见 VALID_LIST
5.6.1.3 按Initialization Time初始化时间循环
在按初始化时间循环(LOOP_BY = INIT 或 RETRO)时,需设置以下变量:
-
INIT_TIME_FMT
- 定义用户可在 METplus 包装器中配置的初始化时间格式。
- 例如:
格式示例:INIT_TIME_FMT = %Y%m%d%H
2019020112
表示 2019 年 2 月 1 日 12 时。
-
INIT_BEG
- 指定要处理的第一个初始化时间。
-
INIT_END
- 指定可处理的最后一个初始化时间。
注意:不一定会处理为此变量指定的时间。它用于确定可以处理的运行时间的截止时间。例如,如果 METplus Wrappers 配置为从 2019-02-01 开始并于 2019-02-02 结束,以 48 小时为增量处理数据,则它将处理 2019-02-01,然后将运行时间增加到 2019-02-03 。这晚于 INIT_END 有效,因此执行将停止。但是,如果增量设置为 24 小时(请参阅 INIT_INCRMENT),则 METplus Wrappers 将在结束执行之前处理初始化时间 2019-02-01 和 2019-02-02。
-
INIT_INCREMENT
- 指定每个运行时间的增量,用于计算下一个运行时间。
示例配置:
[config] LOOP_BY = INIT INIT_TIME_FMT = %Y%m%d%H INIT_BEG = 2019020100 INIT_END = 2019020200 INIT_INCREMENT = 6H
此配置将处理从 2019 年 2 月 1 日 00Z 到 2019 年 2 月 2 日 00Z,每 6 小时递增。
-
INIT_LIST
If the intervals between run times are irregular, then an explicit list of times can be defined. The following example will process the same times as the previous example:
[config]
LOOP_BY = INIT
INIT_TIME_FMT = %Y%m%d%H
INIT_LIST = 2019020100, 2019020106, 2019020112, 2019020118, 2019020200
See the glossary entry for INIT_LIST for more information.
5.6.1.4 按Forecast Leads预报时效循环
许多wrappers还将循环遍历相对于当前valid/initialization time的预报时效forecast leads列表。
- LEAD_SEQ
此变量定义相对于当前有效/初始化时间的预报时效列表。逗号分隔。例如:
LEAD_SEQ = 3, 6, 9
If LOOP_BY = VALID and the current run time is 2019-02-01 at 00Z, then three times will be processed:
-
Initialized on 2019-01-31 at 21Z / valid on 2019-02-01 at 00Z
-
Initialized on 2019-01-31 at 18Z / valid on 2019-02-01 at 00Z
-
Initialized on 2019-01-31 at 15Z / valid on 2019-02-01 at 00Z
If LOOP_BY = INIT and the current run time is 2019-02-01 at 00Z, then three times will be processed:
-
Initialized on 2019-02-01 at 00Z / valid on 2019-02-01 at 03Z
-
Initialized on 2019-02-01 at 00Z / valid on 2019-02-01 at 06Z
-
Initialized on 2019-02-01 at 00Z / valid on 2019-02-01 at 09Z
所以,LOOP_BY=VALID为(过去)不同起报时间的预报到当前时间,LOOP_BY=INIT为相同起报时间(当前)预报未来不同时间。
对于许多预报,还可以使用开始结束增量Begin End Increment (begin_end_incr)定义 LEAD_SEQ。例如:
[config] LEAD_SEQ = begin_end_incr(0,12,3)
等价于
[config] LEAD_SEQ = 0, 3, 6, 9, 12
Forecast Leads分组
也可以使用特殊的 LEAD_SEQ 变量对预测潜在客户进行分组。如果 {APP_NAME}_RUNTIME_FREQ, 比如 SERIES_ANALYSIS_RUNTIME_FREQ, 设置成 RUN_ONCE_PER_INIT_OR_VALID, 那么预报时效分组可以一起评估。然后可以定义预测线索组来一起评估。可以通过设置配置变量 LEAD_SEQ_1、LEAD_SEQ_2、...、LEAD_SEQ_<n> 来定义任意数量的这些组。该值可以使用逗号分隔的整数列表(目前仅支持小时)或使用开始结束增量 (begin_end_incr) 来定义。每个 LEAD_SEQ_<n> 必须有一个相应的变量 LEAD_SEQ_<n>_LABEL。比如:b For example:
[config] LEAD_SEQ_1 = 0, 6, 12, 18 LEAD_SEQ_1_LABEL = Day1 LEAD_SEQ_2 = begin_end_incr(24,42,6) LEAD_SEQ_2_LABEL = Day2
在本例子中,标签Day1 成员为 0, 6, 12, 18, 标签 Day2成员为24, 30, 36, 42.
Forecast leads 同样可以用以下方法定义:用一个单独的LEAD_SEQ,然后对于每个group使用LEAD_SEQ_GROUP_SIZE指定group size。比如:
[config] LEAD_SEQ = 0, 12, 24, 36 LEAD_SEQ_GROUP_SIZE = 1d
这个配置将会创建预报的组,每个组的大小是1天。这个等价于:
[config] LEAD_SEQ_1 = 0, 12 LEAD_SEQ_2 = 24, 36
每个组将会被标签为 Group<INDEX> 其中 <INDEX>是 group number. 在本例子中,标签Group1 为 0, 12 ,而 Group2将会是24, 36. 标签可以使用{label}被索引在文件名模板中。
如果想把字符“Group”改成其他字符串,可以设置(参见 LEAD_SEQ_GROUP_LABEL) :
LEAD_SEQ_GROUP_LABEL = Day
这样就可以把组的名字改成成Day1和Day2.
LEAD_SEQ_<n>_LABEL 也可以用于修改特定的某一组的名称,对于之前的例子,设置:
LEAD_SEQ_2_LABEL = SecondDay
就会将组名字改成Day1 和 SecondDay.
如果forecast leads列表包含一个gap,即没有属于给定组的leads,则该组将被跳过。例如:
[config] LEAD_SEQ = 0, 12, 48, 60 LEAD_SEQ_GROUP_SIZE = 1d LEAD_SEQ_GROUP_LABEL = Day
标签Day1 will be used for 0, 12,标签Day3 will be used for 48, 60,标签Day2不会创建(因为没有24,)。
INIT_SEQ
如果 METplus Wrappers 配置为按有效时间循环 (LOOP_BY = VALID),则可以使用 INIT_SEQ 代替 LEAD_SEQ。这是数据中可用的初始化时间列表。这非常有用,如果需要根据评估的有效时间使用不同的 forecast leads(数据初始化时间已知)。例如:
[config] LOOP_BY = VALID INIT_SEQ = 0, 6, 12, 18
在有效时间2019-02-01 00Z,该初始化序列将构建0、6、12、18、24、30等的forecast lead列表,并且,在有效时间2019-02-01 01Z,该初始化序列将构建预测领先名单为 1、7、13、19、25、31 等。
如果使用 INIT_SEQ, 通过设置 LEAD_SEQ_MIN 和 LEAD_SEQ_MAX 限制将使用的预报时效 forecast leads。例如,仅处理 12 到 24 组之间的forecast leads :
[config] LEAD_SEQ_MIN = 12 LEAD_SEQ_MAX = 24
在有效时间 2019-02-01 00Z,该初始化序列将构建 12、18、24 的forecast leads列表,在有效时间 2019-02-01 01Z,该初始化序列将构建 13、19 的forecast lead列表(跳过了25)。
如果使用 LEAD_SEQ,设置最小值和最大值也会影响预测潜在客户列表。 LEAD_SEQ 优先于 INIT_SEQ,因此如果在配置中设置了这两个变量,则 INIT_SEQ 将被忽略,而优先于 LEAD_SEQ。
5.6.1.5 时间间隔单位
配置变量中定义的时间间隔都有默认值:LEAD_SEQ 和 INIT_SEQ 默认为小时,VALID_INCRMENT 和 INIT_INCRMENT 默认为秒。还可以通过在数字末尾添加字母(分别为 Y、m、d、H、M 或 S)来指定年、月、日、小时、分钟或秒的单位。如果未指定单位,则假定为秒。
3600 : 3600 seconds 3600S : 3600 seconds 60M : 60 minutes or 3600 seconds 1H : 1 hour or 3600 seconds 1m : 1 month (relative) 1d : 1 day or 24 hours or 86400 seconds 1Y : 1 year (relative)
月(m)和年(Y)的单位没有固定的间隔,因为月或年的长度是相对于相对日期/时间而言的。因此,这些间隔是根据当前运行时间计算的,并且不能以秒为单位表示,除非运行时间值可用。
5.6.1.6 跳过时间 (SKIP_VALID_TIMES)
支持通过配置跳过特定时间。例如:
SKIP_VALID_TIMES = "%d:30,31"
此配置将跳过每月的 30 日和 31 日。
支持按星期跳过时间:
SKIP_VALID_TIMES = "%a:Sun,Tue,Thu,Sat"
此配置仅处理周一、周三和周五。
Version 3.1 added the ability to skip certain valid times. The configuration variable SKIP_VALID_TIMES (formerly SKIP_TIMES) can be used to provide a list of time formats each with a list of times to not process. Version 6.0.0 added support for skipping initialization times using SKIP_INIT_TIMES and including specific valid and/or initialization times using INC_VALID_TIMES and INC_INIT_TIMES.
The format and time list are separated by a colon. Any numeric python strftime formatting directive can be used as the time format (see https://strftime.org). Each item in the list must be surrounded by quotation marks.
The following examples involve skipping and/or including valid times, but the same formatting and rules apply to the corresponding initialization time variables.
Example 1:
[config]
SKIP_VALID_TIMES = "%m:3"
This will skip the 3rd month, March.
Example 2:
[config]
SKIP_VALID_TIMES = "%d:30,31"
This will skip every 30th and 31st day.
Example 3:
[config]
SKIP_VALID_TIMES = "%d:30,31", "%m:3"
This will skip every 30th and 31st day and every 3rd month.
Begin End Increment (begin_end_incr) syntax can be used to define a range of times to skip.
b = begin value, e = end value,
i = increment between each value
Example 4:
[config]
SKIP_VALID_TIMES = "%H:begin_end_incr(0,22,2)"
This will skip every even hour (starting from 0, ending on 22, by 2). This is equivalent to:
[config]
SKIP_VALID_TIMES = "%H:0,2,4,6,8,10,12,14,16,18,20,22"
Multiple strftime directives can be specified in a single time format.
Example 5:
[config]
SKIP_VALID_TIMES = "%Y%m%d:19991231, 20141031"
This will skip the dates Dec. 31, 1999 and Oct. 31, 2014.
To only skip certain times for a single wrapper, use a wrapper-specific variable. Using a wrapper-specific variable will ignore the generic SKIP_VALID_TIMES values.
Example 6:
[config]
GRID_STAT_SKIP_VALID_TIMES = "%m:3,4,5,6,7,8,9,10,11"
SKIP_VALID_TIMES = "%d:31"
This will skip the months March through November for GridStat wrapper only. All other wrappers in the PROCESS_LIST will skip the 31st day of each month. Note that the SKIP_VALID_TIMES values are not applied to GridStat in this case.
Support for skipping times by the day of the week was added in v6.0.0.
Example 7:
[config]
SKIP_VALID_TIMES = "%a:Sun,Tue,Thu,Sat"
This will skip all days of the week except for Monday, Wednesday, and Friday.
Also added in v6.0.0 is the ability to specify times to include with INC_VALID_TIMES. If this is set, then any times that do not match the include rules will be skipped.
Example 8:
[config]
INC_VALID_TIMES = "%a:Mon,Wed,Fri"
This will skip all days of the week except for Monday, Wednesday, and Friday.
INC_VALID_TIMES also supported wrapper-specific versions, e.g. GRID_STAT_INC_VALID_TIMES.
INC_VALID_TIMES and SKIP_VALID_TIMES can be used together.
Example 9:
[config]
INC_VALID_TIMES = "%a:Mon,Wed,Fri"
SKIP_VALID_TIMES = "%d:1"
This will only process times that land on Monday, Wednesday, and Friday except the 1st of the month.
5.6.1.7 Realtime Looping实时循环
可使用以下关键字定义实时运行时间:
- {now}:当前时间
- {today}:当前日期
- shift:偏移量
- truncate:向下取整
示例:
VALID_BEG = {now?fmt=%Y%m%d%H?shift=-86400?truncate=21600}
VALID_END = {now?fmt=%Y%m%d%H}
此配置将从前一天的最近 6 小时时间间隔开始运行,直到当前时间。
Now and Today
为了使实时运行更容易,METplus Wrappers 支持定义相对于当前时钟时间的开始和结束时间。例如,如果当前时间是 2019-04-26 08:17 并且 METplus Wrappers 运行时:
[config] VALID_END = {now?fmt=%Y%m%d%H}
then the value of VALID_END will be set to 2019042608. {today} can also be used to substitute the current YYYYMMDD, i.e. 20190426. The formatting for the ‘today’ keyword cannot be changed..
Shift Keyword
“shift”关键字可用于将当前时间移动任意秒数。例如,如果 METplus Wrappers 在同一时钟时间运行:
[config] VALID_BEG = {now?fmt=%Y%m%d%H?shift=-86400}
then the value of VALID_BEG will be set to the current clock time shifted by -86400 seconds (24 hours backwards), or 2019-04-25 08Z.
The value defined for ‘shift’ also supports Time Interval Units.
If VALID_INCREMENT is set to 21600 seconds (6 hours), then the METplus Wrappers will process the following valid times:
Truncate Keyword
用户可能希望将 METplus Wrappers 配置为在给定日期的 00Z、06Z、12Z 和 18Z(而不是 02Z、08Z、14Z 和 20Z)进行处理。如果在 08Z 或 09Z 运行,则必须以不同方式调整换档量才能使时间对齐,这将是很乏味的。相反,请使用“truncate”关键字。此处设置的值是用于确定向下舍入的时间间隔的秒数。要每 6 小时处理一次,请将“截断”设置为 21600 秒:
[config] VALID_BEG = {now?fmt=%Y%m%d%H?shift=-86400?truncate=21600}
这会将值向下舍入到最接近的 6 小时时间间隔。在 20190426 的 06Z -12Z 之间(左闭右开)启动 METplus Wrappers 将导致 VALID_BEG = 2019042506(时钟时间向后移动 24 小时,然后截断为最近的 6 小时时间)。
Starting METplus Wrappers on 20190426 at 08:16 with the following configuration:
[config] LOOP_BY = VALID VALID_TIME_FMT = %Y%m%d%H VALID_BEG = {now?fmt=%Y%m%d%H?shift=-86400?truncate=21600} VALID_END = {now?fmt=%Y%m%d%H} VALID_INCREMENT = 21600
will process valid times starting on 20190425 at 06Z every 6 hours until the current run time is later than 20190426 at 08Z, which will result in processing the following valid times:
Note
使用“now”关键字时,VALID_TIME_FMT 的值必须与 VALID_BEG 和 VALID_END 中“now”项对应的“fmt”值相同。在上面的示例中,这将是 VALID_TIME_FMT、VALID_BEG 和 VALID_END 变量值内的 %Y%m%d%H 部分。