Antwoord voor Eddy - structuur input files meetgegevens voor ALVA

ALVA2 heeft meetgegevens nodig, die in csv files worden opgeslagen. Deze csv files worden door aparte programma’s (getrivm) geproduceerd. Leidschendam-Voorburg heeft een getrivm geschreven gebaseerd op de oude rivm.samenmeten.nl website. Gouda heeft een getrivm geschreven op basis van de nieuwe API.

ALVA2 leest deze files, en veronderstelt:

Eerste regel: er is één, en niet meer dan één, csv file per station per maand. Alle csv files staan in één directory. De eerste stap in ALVA2.x is het analyseren van deze directory met de volgende output (voorbeeld van een directory voor wat rekenwerk op officiële RIVM stations):

CURRENT DIRECTORY : C:\Users\frans\Documents\Calc\Analyse10
Input Data Directory : C:\Users\frans\Documents\Calc\Analyse10_SRC20201007

NL10404 - Den Haag-Rebecquestraat 201708 - 202009 n = 38
NL10418 - Rotterdam-Schiedamsevest 201708 - 202009 37 van 38
geen gegevens [201713]
NL10445 - Den Haag-Veerkade 201708 - 202009 37 van 38
geen gegevens [201713]
NL10446 - Den Haag-Bleriotlaan 201708 - 202009 37 van 38
geen gegevens [201713]
NL10448 - Rotterdam-Bentinckplein 201708 - 202009 37 van 38
geen gegevens [201713]
~NBI_SB945 202007 - 202007 n = 1
~NL01493 201601 - 202010 n = 58
~NL10404 201601 - 202010 n = 58
~NL10418 201601 - 202010 n = 58
~NL10445 201601 - 202010 n = 58
~NL10446 201601 - 202010 n = 58

Er zit een bugje in deze routine – hij zoekt ook naar een 13e maand… Omdat dit geen gevolgen heeft is die routine nog niet verder debugged.

Tweede regel: de naam van het station en de maand staan gecodeerd in de naam van de file. Bovendien geeft een precursor aan wat de oorsprong is. Deze precursor is noodzakelijk omdat de inhoud van de csv kan verschillen, met name de aanduiding van de tijd, of dat de gegevensreeksen gekalibreerd zijn of niet (of dat zowel gekalibreerd als niet gekalibreerd aanwezig kan zijn). Het eerste teken is altijd een underscore, daarna de eventuele precursor, dan de stationnaam, dan een underscore, dan de maand aanduiding (formaat yyyymm), dan .csv

Derde regel: tijd aanduiding is altijd in een kolom met naam “periode”. In ALVA 2.1 en daarvoor moest deze kolom op een vaste plaats staan, in ALV2.2 is die plaats willekeurig.

ALVA 2.1 konalleen de tijdaanduiding in NL lokale tijd aan (oude getrivm met oude samenwerken interface). De formaten die in Gouda worden gemaakt gebruiken tijdaanduiding in UTC. Ik onderken nu de volgende groepjes waarvoor ik de datumformaat ophaal (is gedefinieerd in een nieuwe versie van StationDirectory diebij ALVA 2.2 beschikbaar komt). Datformat is het datumformaat, en typeformat is een logical die True is als de tijd in UTC is.
Ik moet bij dit lijstje nog wel zeggen dat ik de datumformaat voor ~LTD en ~CSLV nog niet heb gecontroleerd. Ik vermoed dat het dataformat voor ~SB (de NBI_SB kastjes) ook goed werkt voor de Luftdatenkastjes en voor de paddenstoelen.

def datumformaat(soortfile):
datformat = {
‘GEM’: ‘%Y-%m-%d %H:%M:%S’,
‘RIVM’: ‘%Y-%m-%d %H:%M:%S’,
‘~RIVM’: “%Y-%m-%dT%H:%M:%S%z” ,
‘CSLV’:‘%Y-%m-%d %H:%M:%S’,
‘XCSLV’:‘%Y-%m-%d %H:%M:%S’,
‘~CSLV’: “%Y-%m-%d %H:%M:%S.000Z” ,
‘SB’:‘%Y-%m-%d %H:%M:%S’,
‘~SB’: “%Y-%m-%d %H:%M:%S%z”,
‘LTD’:‘%Y-%m-%d %H:%M:%S’,
‘~LTD’: “%Y-%m-%d %H:%M:%S.000Z” ,
‘_PS’:‘%Y-%m-%d %H:%M:%S’}
# typeformat is True if format is aware
typeformat = True if soortfile[0] == “~” else False
return datformat[soortfile] ,typeformat

Vierde regel:
De kolomnamen hebben een betekenis, en helaas verschilt die betekenis voor elke file. Daarom heb ik de definities in StandardDirectory.py opgenomen (nu StandardDirectory22.py).
In python taal de definities (# is het teken dat commentaar volgt). Ik heb in ALVA 2.2 ingebouwd dat PM10 zowel als P10 wordt geaccepteerd, net als PM25 als P25.

{
1: “NO2”, # :‘NO$2$ (gemeten)’
2: “NO2_ref1”, #:‘NO$2$ (ref 1)',
3: “NO2_ref2”, #:‘NO$2$ (ref 2)',
4: “NO2_kal”, #:‘NO$2$ (geijkt)',
5: “P10”,#'P$
{10}$’,
6: “P10_ref1”,#:'P$
{10}$ (ref 1)’,
7: “P10_ref2”,#:'P$
{10}$ (ref 2)’,
8: “P10_kal”,#:'P$
{10}$ (geijkt)’,
9: “P25”,#:‘P${2.5}$',
10: “P25_ref1”,#:'P$
{2.5}$ (ref 1)’,
11: “P25_ref2”,#:‘P${2.5}$ (ref 2)',
12: “P25_kal”,#:'P$
{2.5}$ (geijkt)’,
13: “temp”,#:“Temperatuur sensor”,
14: “rh”,#:“Luchtvochtigheid sensor”,
15: “ld”,#:“Luchtdruk sensor”
16: “FN”, #fumee noire - zwarte rook - staat voor Roet
17: “O3”, #ozon
18: “NO”, #stikstofmonoxide
19: “SO2” #zwaveldioxide
}

Deze documentatie moet verder worden uitgebouwd, en zal deel uitmaken van de documentatie van ALVA2.2

Frans Kets