Examples: Manipulating Headers¶
Example 1: Change the data time in the fixed header to 12:00 01/02/03¶
import mule
ff = mule.FieldsFile.from_file("InputFile")
ff.fixed_length_header.t1_year = 2003
ff.fixed_length_header.t1_month = 2
ff.fixed_length_header.t1_day = 1
ff.fixed_length_header.t1_hour = 12
ff.fixed_length_header.t1_minute = 0
ff.to_file("OutputFile")
Note
You could instead choose to refer to the indices of the raw array (e.g. ff.fixed_length_header.raw[21] = 2003, etc.) though the form above is preferable (more readable).
Example 2: Change the forecast time (lbft) in the 3rd lookup header to 12¶
import mule
ff = mule.FieldsFile.from_file("InputFile")
ff.fields[2].lbft = 12
ff.to_file("OutputFile")
Note
You could instead choose to refer to the indices of the raw array (e.g. ff.fields[2].raw[14] = 12) though the named form is preferable (more readable).
In this example we are assuming that the 2nd field in the file has a valid header release number (lbrel == 2 or 3); if it didn’t then it may not have an lbft attribute.
Example 3: Change the validity time in all lookup headers to 12:00 01/02/03¶
import mule
ff = mule.FieldsFile.from_file("InputFile")
for field in ff.fields:
if field.lbrel in (2,3):
field.lbyr = 2003
field.lbmon = 2
field.lbdat = 1
field.lbhr = 12
field.lbmin = 0
ff.to_file("OutputFile")
Note
You could instead choose to refer to the indices of the raw array (e.g. field.raw[1] = 2003) though the named form is preferable (more readable).
Notice the check on lbrel - only fields with a valid release number will correctly support all named lookup attributes (lbyr, lbmon, etc.) so ignore other field types to avoid problems (good practice).
Example 4: Round the validity time in all lookup headers to the nearest hour¶
import mule
from datetime import datetime, timedelta
ff = mule.FieldsFile.from_file("InputFile")
for field in ff.fields:
if field.lbrel in (2,3):
# Create a datetime object (handles date incrementing logic)
field_date = datetime(
field.lbyr, field.lbmon, field.lbdat, field.lbhr, field.lbmin)
# Create and apply a timedelta to take the time to the nearest hour
if field_date.minute >= 30:
incr_seconds = (60 - field_date.minute)*60
field_date += timedelta(seconds=incr_seconds)
else:
incr_seconds = field_date.minute*60
field_date -= timedelta(seconds=incr_seconds)
# Now extract the components again to set the lookup values
field.lbyr = field_date.year
field.lbmon = field_date.month
field.lbdat = field_date.day
field.lbhr = field_date.hour
field.lbmin = field_date.minute
ff.to_file("OutputFile")
Note
You could instead choose to refer to the indices of the raw array (e.g. field.raw[1] = field_date.year) though the named form is preferable (more readable).
Notice the check on lbrel - only fields with a valid release number will correctly support all named lookup attributes (lbyr, lbmon, etc.) so ignore other field types to avoid problems (good practice).
This example uses the Python datetime library, which should be treated with some caution (its timezone support is not particularly robust) - a possible alternative would be the isodatetime module.
Example 5: Change the data time in all lookup headers to 12:00 01/02/03 and reset forecast hour to match¶
import mule
from datetime import datetime, timedelta
ff = mule.FieldsFile.from_file("InputFile")
# Create a datetime object at the reference time
field_data_t_new = datetime(2003, 2, 1, 12, 0)
for field in ff.fields:
if field.lbrel in (2,3):
# Create a datetime object (handles date incrementing logic)
field_data_t = datetime(
field.lbyrd, field.lbmond, field.lbdatd, field.lbhrd, field.lbmind)
# The datetime objects will return a timedelta object when subtracted
data_t_delta = field_data_t_new - field_data_t
# Convert this delta to whole hours (truncated)
data_t_delta_hours = data_t_delta.days*24.0 + data_t_delta.seconds//3600
# Set the lookup values
field.lbyrd = field_data_t_new.year
field.lbmond = field_data_t_new.month
field.lbdatd = field_data_t_new.day
field.lbhrd = field_data_t_new.hour
field.lbmind = field_data_t_new.minute
# Adjust the forecast time by the amount calculated above
field.lbft += data_t_delta_hours
ff.to_file("OutputFile")
Note
You could instead choose to refer to the indices of the raw array (e.g. fields.raw[1] = field_date.year) though the named form is preferable (more readable).
Notice the check on lbrel - only fields with a valid release number will correctly support all named lookup attributes (lbyrd, lbmond, etc.) so ignore other field types to avoid problems (good practice).
This example uses the Python datetime library, which should be treated with some caution (its timezone support is not particularly robust) - a possible alternative would be the isodatetime module.