You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 3 Next »


This page describes the Brazilian Wigos test case. The goal was to encode the input data into a BUFR file including the Wigos information.

The input data was kindly provided by Jose Mauro Rezende from INMET. This data consisted in several

records in csv format.

A8062018918012.820-48.6-27.64.87191918.991919117.517.517.51011.11011.110110.6202.9-0.2550///////////////=
A7652018918012.622-46.14-23.84520.220.520.293949119.119.218.91011.71011.81011.60.73241.3-1.0570///////////////=
A9072018918012.528-54.6-16.5289.826.226.225.677787421.821.821.1979.1979.1977.41.42962.4-3.3780///////////////=
A3052018918012.328-38.5-3.129.5526.226.326.169726920.120.720.11009.61009.61008.82.81057.7-3.540///////////////=
A4502018918012.528-38.3-10.0826124.925.724.967676218.318.317.9985985984.14.111110.7-3.1430///////////////=
A0252018918012.321-50.96-17.78780.119.219.519.28788851717.316.9927.5927.5926.72.6703.5-3.4980///////////////=


Jose Mauro also provided the following excel file containing the metadata giving the meaning of each column of the previous file.


DATEHOURTENSTEMPAIR TEMP.RELATIVE UMIDDEW POINT PRESSUREWINDS

CLOUD COVER

STATIONYEARMONDAYOBS.BATCPUINST.MAXMININSTMAXMININSTMAXMININSTMAXMINSpeedDirGustRADPRECTOTCODEBASEVISIB




UTCVºCºCºCºC%%%ºCºCºChPahPahPam/sºm/skJ/m2mm




A001200071012.52219.620.719.54545407.27.56.6889.1889.1888.81.61134.0-40.0///////////////=
A001200071112.52120.120.219.73947395.88.15.8889.4889.4889.12.2714.5-40.0///////////////=
A001200071212.52119.620.219.63639364.35.84.3889.3889.4889.32.3754.0-40.0///////////////=
A001200071312.52118.319.718.34343365.55.54.2889.0889.3889.01.5784.1-40.0///////////////=





























CODIGOS SIM




I101I608I612I105I617I618I103I613I614I106I615I616I111I113I608I133I175

I118I110























































































ESTAÇÃO = Mnnn



M=Organização

xnn = sequencialPrimeiro digito x=Distrito, nn=sequencial de instalação em cada Distrito







































YEAR MONTH DAY HOUR



(HOUR UTC)



















































BATERY VOLTAGE
























































CPU TEMPERATURE
























































AIR TEMPERATURE



INSTANTANEOUS, MAXIMA and MINIMA



















































RELATIVE HUMIDITY



INSTANTANEOUS, MAXIMA and MINIMA



















































DEW POINT



INSTANTANEOUS, MAXIMA and MINIMA



















































PRESSURE



INSTANTANEOUS, MAXIMA and MINIMA



















































WINDS



DIREÇÃO, VELOCIDADE E RAJADA



















































SOLAR RADIATION
























































PRECIPITATION
























































CLOUD COVER



TOTAL, CODE and CLOUD BASE (Manually inserted on the station via keyboard)



















































VISIBILITY



























To achieve this goal, the SYNOP template 307091 was used from the current  messages  like  ISAI01-SBBR-041400-RRA.bfr and added  the sequence 301150 that contains the

Wigos information.

The script code follows

test_wigos4.py
#!/usr/bin/env python
'''
# Copyright 2005-2018 ECMWF.
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
# granted to it by virtue of its status as an intergovernmental organisation
# nor does it submit to any jurisdiction

This is a test program to encode Wigos Synop 
requires 

1) ecCodes version 2.8 or above (available at https://confluence.ecmwf.int/display/ECC/Releases)
2) python2.7

To run the program

   ./test_wigos4.py -a Ascii_csv_file  -b output_Bufr
   
Uses BUFR version 4 template  301150 307091

Author : Roberto Ribas Garcia ECMWF 27 Sep 2018
'''

from eccodes import (codes_set, codes_set_array, codes_bufr_new_from_samples,codes_write,codes_get_api_version, 
                     codes_release, CodesInternalError,CODES_MISSING_DOUBLE,CODES_MISSING_LONG) 
import pandas as pd
from datetime import datetime
import argparse 

def read_cmdline():
    '''
    reads the command line to get the input ascii filename and the output bufr file
    usage
         prog  -a Ascii_input_file  -b Bufr_output_file
    '''
    p=argparse.ArgumentParser()
    p.add_argument("-a","--ascii",help=" input Ascii filename")
    p.add_argument("-b","--bufr", help="output Bufr filename")
    args=p.parse_args()
    return args

def read_ascii(inputFilename):
    '''
    function to read the Ascii data into a pandas dataframe, 
    args:
          inputFilename :   full path of the Ascii file for example /tmp/data/rema_20180918.txt
     
    uses white spaces as column delimiters
    index_col=False avoids using the first column (Station) as index
    names is the list of names from the excel it can be changed but this affects the dataframe
    '''
    df=pd.read_csv(inputFilename,header=None,index_col=False,delim_whitespace=True,names=["station","year","month","day",
                                                        "ObsHour","TensBat","TempCpu","lon","lat","hp","airTinst","airTmax",
                                                      "airTmin","relHinst","relHmax","relHmin","dewPInst","dewPmax","dewPmin" ,
                                                      "PresInst","PresMax","PresMin","WindSpeed","WindDir","WindGust",
                                                       "Rad","Precip","CloudCoverTot","CloudCODE","CloudBase","Visib"])
    print df.head()
    return df 


def message_encoding(FullInputFileName,fout):
    '''
    Message encoding function 
    FullInputFilename      :     full path of the Ascii file for example /tmp/data/rema_20180918.txt
    fout                   :     file Object to write the output bufr file( obtained by a call to open )
    
    Requires ecCodes and the BUFR4_local template on  
                 ECCODES_PATH/share/eccodes/samples

    '''
    TEMPLATE='BUFR4_local'
    
    # reads the Ascii file into a pandas Dataframe
    dfFull=read_ascii(FullInputFileName)
  
    # loops over the rows of the dataFrame dfFull  
    for _,row in dfFull.iterrows():
        bid=codes_bufr_new_from_samples(TEMPLATE)
        try:
            bufr_encode_new(bid,row)
            codes_write(bid,fout)
        except CodesInternalError as ec:
            print ec
        codes_release(bid)


def bufr_encode_new(ibufr,row):
    '''
    encodes the new SYNO 307091 adding the  1125, 1126, 1127, 1128 wigos keys before.
    '''
    ivalues = (  
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1,   
      1, 1, 1, 1 ,)
    codes_set_array(ibufr, 'inputShortDelayedDescriptorReplicationFactor', ivalues)
    codes_set(ibufr, 'edition', 4)
    codes_set(ibufr, 'masterTableNumber', 0)
    codes_set(ibufr, 'bufrHeaderCentre', 98)
    codes_set(ibufr, 'bufrHeaderSubCentre', 0)
    codes_set(ibufr, 'updateSequenceNumber', 0)
    codes_set(ibufr, 'dataCategory', 0)
    codes_set(ibufr, 'internationalDataSubCategory', 255)
    codes_set(ibufr, 'dataSubCategory', 170)
    codes_set(ibufr, 'masterTablesVersionNumber', 29)
    codes_set(ibufr, 'localTablesVersionNumber', 0)
# set the YMD
    codes_set(ibufr, 'typicalYear', row["year"])
    codes_set(ibufr, 'typicalMonth', row["month"])
    codes_set(ibufr, 'typicalDay', row["day"])
    codes_set(ibufr, 'typicalHour', row["ObsHour"])
    codes_set(ibufr, 'typicalMinute', 0)
    codes_set(ibufr, 'typicalSecond', 0)
    # Encodes  the Section 2 of the BUFR used internally at ECMWF (start here)
    codes_set(ibufr, 'rdbType', 1)
    codes_set(ibufr, 'oldSubtype', 176)
    codes_set(ibufr, 'localYear', row["year"])
    codes_set(ibufr, 'localMonth', row["month"])
    codes_set(ibufr, 'localDay', row["day"])
    codes_set(ibufr, 'localHour', row["ObsHour"])
    codes_set(ibufr, 'localMinute', 0)
    codes_set(ibufr, 'localSecond', 0)
    procTime=datetime.now()
    codes_set(ibufr, 'rdbtimeDay', procTime.day)
    codes_set(ibufr, 'rdbtimeHour', procTime.hour)
    codes_set(ibufr, 'rdbtimeMinute', procTime.minute)
    codes_set(ibufr, 'rdbtimeSecond', procTime.second)
    codes_set(ibufr, 'rectimeDay', procTime.day )
    codes_set(ibufr, 'rectimeHour', procTime.hour)
    codes_set(ibufr, 'rectimeMinute', procTime.minute)
    codes_set(ibufr, 'rectimeSecond', procTime.second)
    codes_set(ibufr, 'correction1', 0)
    codes_set(ibufr, 'correction1Part', 0)
    codes_set(ibufr, 'correction2', 0)
    codes_set(ibufr, 'correction2Part', 0)
    codes_set(ibufr, 'correction3', 0)
    codes_set(ibufr, 'correction3Part', 0)
    codes_set(ibufr, 'correction4', 0)
    codes_set(ibufr, 'correction4Part', 0)
    codes_set(ibufr, 'qualityControl', 70)
    codes_set(ibufr, 'newSubtype', 0)
    codes_set(ibufr, 'numberOfSubsets', 1)
    lat=row["lat"]
    lon=row["lon"]
    codes_set(ibufr, 'localLatitude', lat)
    codes_set(ibufr, 'localLongitude', lon)
    #### End of encoding local section 2 
    codes_set(ibufr, 'observedData', 1)
    codes_set(ibufr, 'compressedData', 0)

    ivalues=(301150,307091)
    codes_set_array(ibufr, 'unexpandedDescriptors', ivalues)

    codes_set(ibufr, 'wigosIdentifierSeries',0 )
    codes_set(ibufr, 'wigosIssuerOfIdentifier', 76)
    codes_set(ibufr, 'wigosIssueNumber', 0)
    codes_set(ibufr, 'wigosLocalIdentifierCharacter','0760999999999')
    codes_set(ibufr, 'stateIdentifier', CODES_MISSING_LONG)
    codes_set(ibufr, 'nationalStationNumber', CODES_MISSING_LONG)
    codes_set(ibufr, 'blockNumber', CODES_MISSING_LONG)
    codes_set(ibufr, 'stationNumber', CODES_MISSING_LONG)
    codes_set(ibufr, 'stationOrSiteName',row["station"])
    codes_set(ibufr, 'stationType', CODES_MISSING_LONG)
    codes_set(ibufr, 'year', row["year"])
    codes_set(ibufr, 'month', row["month"])
    codes_set(ibufr, 'day', row["day"])
    codes_set(ibufr, 'hour', row["ObsHour"])
    codes_set(ibufr, 'minute', 0)
    codes_set(ibufr, 'latitude', lat)
    codes_set(ibufr, 'longitude', lon)
    height=row["hp"]
    codes_set(ibufr, 'heightOfStationGroundAboveMeanSeaLevel', height)
    codes_set(ibufr, 'heightOfBarometerAboveMeanSeaLevel', 1.5)
    codes_set(ibufr, 'surfaceQualifierForTemperatureData', CODES_MISSING_LONG)
    codes_set(ibufr, 'mainPresentWeatherDetectingSystem', CODES_MISSING_LONG)
    codes_set(ibufr, 'supplementaryPresentWeatherSensor', CODES_MISSING_LONG)
    codes_set(ibufr, 'visibilityMeasurementSystem', CODES_MISSING_LONG)
    codes_set(ibufr, 'cloudDetectionSystem', CODES_MISSING_LONG)
    codes_set(ibufr, 'lightningDetectionSensorType', CODES_MISSING_LONG)
    codes_set(ibufr, 'skyConditionAlgorithmType', CODES_MISSING_LONG)
    codes_set(ibufr, 'capabilityToDetectPrecipitationPhenomena', CODES_MISSING_LONG)
    codes_set(ibufr, 'capabilityToDetectOtherWeatherPhenomena', CODES_MISSING_LONG)
    codes_set(ibufr, 'capabilityToDetectObscuration', CODES_MISSING_LONG)
    codes_set(ibufr, 'capabilityToDiscriminateLightningStrikes', CODES_MISSING_LONG)
    codes_set(ibufr, '#1#nonCoordinatePressure', CODES_MISSING_DOUBLE)
    pressure=row["PresInst"]*100
    codes_set(ibufr, 'pressureReducedToMeanSeaLevel', pressure)
    codes_set(ibufr, '3HourPressureChange', CODES_MISSING_DOUBLE)
    codes_set(ibufr, 'characteristicOfPressureTendency', CODES_MISSING_LONG)
    codes_set(ibufr, 'pressure', pressure)
    codes_set(ibufr, 'nonCoordinateGeopotentialHeight', CODES_MISSING_LONG)
    codes_set(ibufr, '#1#heightOfSensorAboveLocalGroundOrDeckOfMarinePlatform', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#1#heightOfSensorAboveWaterSurface', CODES_MISSING_DOUBLE)
    temperature=row["airTinst"]+273.15
    codes_set(ibufr, '#1#airTemperature', temperature)
    dewPoint=row["dewPInst"]+273.15         
    codes_set(ibufr, 'dewpointTemperature', dewPoint)
    codes_set(ibufr, '#1#relativeHumidity', row["relHinst"])
    codes_set(ibufr, '#1#depthBelowLandSurface', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#1#soilTemperature', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#2#depthBelowLandSurface', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#2#soilTemperature', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#3#depthBelowLandSurface', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#3#soilTemperature', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#4#depthBelowLandSurface', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#4#soilTemperature', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#5#depthBelowLandSurface', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#5#soilTemperature', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#6#depthBelowLandSurface', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#2#heightOfSensorAboveLocalGroundOrDeckOfMarinePlatform', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#2#heightOfSensorAboveWaterSurface', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#1#attributeOfFollowingValue', CODES_MISSING_LONG)
    if row["Visib"]=="/////":
        visib=CODES_MISSING_DOUBLE
    else:
        visib=row["Visib"]
    codes_set(ibufr, 'horizontalVisibility', visib)
    codes_set(ibufr, '#3#heightOfSensorAboveLocalGroundOrDeckOfMarinePlatform', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#3#heightOfSensorAboveWaterSurface', CODES_MISSING_DOUBLE)
    codes_set(ibufr, 'iceDepositThickness', CODES_MISSING_DOUBLE)
    codes_set(ibufr, 'rateOfIceAccretionEstimated', CODES_MISSING_LONG)
    codes_set(ibufr, 'methodOfWaterTemperatureAndOrOrSalinityMeasurement', CODES_MISSING_LONG)
    codes_set(ibufr, 'oceanographicWaterTemperature', CODES_MISSING_DOUBLE)
    codes_set(ibufr, 'wavesDirection', CODES_MISSING_LONG)
    codes_set(ibufr, 'periodOfWaves', CODES_MISSING_LONG)
    codes_set(ibufr, 'heightOfWaves', CODES_MISSING_DOUBLE)
    codes_set(ibufr, 'methodOfStateOfGroundMeasurement', CODES_MISSING_LONG)
    codes_set(ibufr, 'stateOfGround', CODES_MISSING_LONG)
    codes_set(ibufr, 'methodOfSnowDepthMeasurement', CODES_MISSING_LONG)
    codes_set(ibufr, 'totalSnowDepth', CODES_MISSING_DOUBLE)
    if row["CloudCoverTot"]=="/":
        CloudCover=CODES_MISSING_LONG
    else:
        CloudCover=row["CloudCoverTot"]   
    codes_set(ibufr, 'cloudCoverTotal', CloudCover)
    codes_set(ibufr, '#1#verticalSignificanceSurfaceObservations', CODES_MISSING_LONG)
    codes_set(ibufr, '#1#cloudAmount', CODES_MISSING_LONG)
    codes_set(ibufr, '#1#cloudType', CODES_MISSING_LONG)
    codes_set(ibufr, '#2#attributeOfFollowingValue', CODES_MISSING_LONG)
    codes_set(ibufr, '#1#heightOfBaseOfCloud', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#2#verticalSignificanceSurfaceObservations', CODES_MISSING_LONG)
    codes_set(ibufr, '#2#cloudAmount', CODES_MISSING_LONG)
    codes_set(ibufr, '#2#cloudType', CODES_MISSING_LONG)
    codes_set(ibufr, '#3#attributeOfFollowingValue', CODES_MISSING_LONG)
    codes_set(ibufr, '#2#heightOfBaseOfCloud', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#3#verticalSignificanceSurfaceObservations', CODES_MISSING_LONG)
    codes_set(ibufr, '#3#cloudAmount', CODES_MISSING_LONG)
    codes_set(ibufr, '#3#cloudType', CODES_MISSING_LONG)
    codes_set(ibufr, '#4#attributeOfFollowingValue', CODES_MISSING_LONG)
    codes_set(ibufr, '#3#heightOfBaseOfCloud', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#4#verticalSignificanceSurfaceObservations', CODES_MISSING_LONG)
    codes_set(ibufr, '#4#cloudAmount', CODES_MISSING_LONG)
    codes_set(ibufr, '#4#cloudType', CODES_MISSING_LONG)
    codes_set(ibufr, '#5#attributeOfFollowingValue', CODES_MISSING_LONG)
    codes_set(ibufr, '#4#heightOfBaseOfCloud', CODES_MISSING_DOUBLE)
    codes_set(ibufr, 'presentWeather', CODES_MISSING_LONG)
    codes_set(ibufr, '#1#timePeriod', CODES_MISSING_LONG)
    codes_set(ibufr, 'pastWeather1', CODES_MISSING_LONG)
    codes_set(ibufr, 'pastWeather2', CODES_MISSING_LONG)
    codes_set(ibufr, '#1#timeSignificance', CODES_MISSING_LONG)
    codes_set(ibufr, '#2#timePeriod', CODES_MISSING_LONG)
    codes_set(ibufr, 'precipitationIntensityHighAccuracy', CODES_MISSING_DOUBLE)
    codes_set(ibufr, 'sizeOfPrecipitatingElement', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#2#timeSignificance', CODES_MISSING_LONG)
    codes_set(ibufr, '#3#timePeriod', CODES_MISSING_LONG)
    codes_set(ibufr, 'precipitationType', CODES_MISSING_LONG)
    codes_set(ibufr, 'characterOfPrecipitation', CODES_MISSING_LONG)
    codes_set(ibufr, 'durationOfPrecipitation', CODES_MISSING_LONG)
    codes_set(ibufr, 'otherWeatherPhenomena', CODES_MISSING_LONG)
    codes_set(ibufr, 'intensityOfPhenomena', CODES_MISSING_LONG)
    codes_set(ibufr, 'obscuration', CODES_MISSING_LONG)
    codes_set(ibufr, 'characterOfObscuration', CODES_MISSING_LONG)
    codes_set(ibufr, '#4#heightOfSensorAboveLocalGroundOrDeckOfMarinePlatform', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#4#heightOfSensorAboveWaterSurface', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#3#timeSignificance', CODES_MISSING_LONG)
    codes_set(ibufr, '#4#timePeriod', CODES_MISSING_LONG)
    codes_set(ibufr, '#1#windDirection', row["WindDir"])
    codes_set(ibufr, '#1#windSpeed', row["WindSpeed"])
    codes_set(ibufr, '#4#timeSignificance', CODES_MISSING_LONG)
    codes_set(ibufr, '#5#timePeriod', CODES_MISSING_LONG)
    codes_set(ibufr, '#1#maximumWindGustDirection', CODES_MISSING_LONG)
    codes_set(ibufr, '#1#maximumWindGustSpeed', row["WindGust"])
    codes_set(ibufr, '#6#timePeriod', CODES_MISSING_LONG)
    codes_set(ibufr, '#2#maximumWindGustDirection', CODES_MISSING_LONG)
    codes_set(ibufr, '#2#maximumWindGustSpeed', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#7#timePeriod', CODES_MISSING_LONG)
    codes_set(ibufr, 'extremeCounterclockwiseWindDirectionOfAVariableWind', CODES_MISSING_LONG)
    codes_set(ibufr, 'extremeClockwiseWindDirectionOfAVariableWind', CODES_MISSING_LONG)
    codes_set(ibufr, '#5#heightOfSensorAboveLocalGroundOrDeckOfMarinePlatform', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#5#heightOfSensorAboveWaterSurface', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#8#timePeriod', CODES_MISSING_LONG)
    codes_set(ibufr, 'maximumTemperatureAtHeightAndOverPeriodSpecified', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#1#minimumTemperatureAtHeightAndOverPeriodSpecified', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#6#heightOfSensorAboveLocalGroundOrDeckOfMarinePlatform', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#9#timePeriod', CODES_MISSING_LONG)
    codes_set(ibufr, '#2#minimumTemperatureAtHeightAndOverPeriodSpecified', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#6#heightOfSensorAboveWaterSurface', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#7#heightOfSensorAboveLocalGroundOrDeckOfMarinePlatform', CODES_MISSING_DOUBLE)
    codes_set(ibufr, 'methodOfPrecipitationMeasurement', CODES_MISSING_LONG)
    codes_set(ibufr, 'methodOfLiquidContentMeasurementOfPrecipitation', CODES_MISSING_LONG)
    codes_set(ibufr, '#10#timePeriod', CODES_MISSING_LONG)
    codes_set(ibufr, 'totalPrecipitationOrTotalWaterEquivalent', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#8#heightOfSensorAboveLocalGroundOrDeckOfMarinePlatform', CODES_MISSING_DOUBLE)
    codes_set(ibufr, 'methodOfEvaporationMeasurement', CODES_MISSING_LONG)
    codes_set(ibufr, '#11#timePeriod', CODES_MISSING_LONG)
    codes_set(ibufr, 'evaporation', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#12#timePeriod', CODES_MISSING_LONG)
    codes_set(ibufr, 'totalSunshine', CODES_MISSING_LONG)
    codes_set(ibufr, '#13#timePeriod', CODES_MISSING_LONG)
    codes_set(ibufr, 'longWaveRadiationIntegratedOverPeriodSpecified', CODES_MISSING_DOUBLE)
    codes_set(ibufr, 'shortWaveRadiationIntegratedOverPeriodSpecified', CODES_MISSING_DOUBLE)
    codes_set(ibufr, 'netRadiationIntegratedOverPeriodSpecified', CODES_MISSING_DOUBLE)
    codes_set(ibufr, 'globalSolarRadiationIntegratedOverPeriodSpecified', CODES_MISSING_DOUBLE)
    codes_set(ibufr, 'diffuseSolarRadiationIntegratedOverPeriodSpecified', CODES_MISSING_DOUBLE)
    codes_set(ibufr, 'directSolarRadiationIntegratedOverPeriodSpecified', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#14#timePeriod', CODES_MISSING_LONG)
    codes_set(ibufr, 'numberOfFlashesThunderstorm', CODES_MISSING_LONG)
    codes_set(ibufr, '#15#timePeriod', CODES_MISSING_LONG)
    codes_set(ibufr, '#1#firstOrderStatistics', CODES_MISSING_LONG)
    codes_set(ibufr, '#2#nonCoordinatePressure', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#2#windDirection', CODES_MISSING_LONG)
    codes_set(ibufr, '#2#windSpeed', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#2#airTemperature', CODES_MISSING_DOUBLE)
    codes_set(ibufr, '#2#relativeHumidity', CODES_MISSING_LONG)
    codes_set(ibufr, '#2#firstOrderStatistics', CODES_MISSING_LONG)
    codes_set(ibufr, 'qualityInformationAwsData', CODES_MISSING_LONG)
    codes_set(ibufr, 'internalMeasurementStatusInformationAws', CODES_MISSING_LONG)

    # Encode the keys back in the data section
    codes_set(ibufr, 'pack', 1)


        



def main():
    '''
    main program reads the command line and encodes the messages into the output filename
       to run the program 
       
          program_name.py   -a Ascii_input_file  -b Bufr_output_file
    '''
    
    print " codes version {0}".format(codes_get_api_version())
    cmdLine=read_cmdline()
    inputFilename=cmdLine.ascii 
    outFilename=cmdLine.bufr 
    fout=open(outFilename,"w")
    message_encoding(inputFilename,fout)
    fout.close()
    print " output file {0}".format(outFilename)
    
if __name__ == '__main__':
    main()



The program reads the input csv file into a pandas Dataframe and uses it to encode the BUFR data with the function encode_bufr_new. This function receives a handle to the bufr message and the dataframe . A template of this function can

be obtained by using


bufr_dump -E python synop.bufr > synop.py


The synop.bufr file must contain only one message.

The file  synop.py contains all the ecCodes instructions needed to produce the synop.bufr file and can be used as a template to create the bufr_encode_new function from the script. In particular, the 301150 sequence can be added at the

beginning of the unexpandedDescriptors list to include the Wigos information accordingly.


The function message_encoding receives the input Filename,  reads the data into the dataframe and loops over  each of the records of the dataframe  creating  individual BUFR mesages that are copied into the file object fout.

This function relies on having the BUFR4_local.tmp  file that is part of the ecCodes installation ( usually available by the following command codes_info)


codes_info

ecCodes Version 2.9.0

Default definition files path is used: /usr/local/apps/eccodes/2.9.0/GNU/6.3.0/share/eccodes/definitions
Definition files path can be changed setting ECCODES_DEFINITION_PATH environment variable

Default SAMPLES path is used: /usr/local/apps/eccodes/2.9.0/GNU/6.3.0/share/eccodes/samples
SAMPLES path can be changed setting ECCODES_SAMPLES_PATH environment variable


The BUFR file contains  section 2 keys that are used locally at ECMWF.

The keys maching the information from the CSV file were populated. For the repeated keys only the first occurrence was populated. The rest of the keys was filled with missing values.

  • No labels