Jag behövde nyligen en bild som visar temperaturvariationen mellan olika år i Helsingfors. Tidigare har det gått att få fram information från Meteorologiska Institutets hemsida men under senare år har man plockat bort all information som eventuellt kunde ifrågasätta den katastrofala globala uppvärmningen.
Eftersom jag inte hittade informationen på FMI (Finnish Meteorologic Institute) så måste jag gå över Atlanten efter informationen. Jag vet att informationen går att hitta på GISS vebbsidor. GISS ger god access till data men de lägger till en hel del tvivelaktiga korrektioner som gör att de har den globala temperaturuppskattning som visar den största uppvärmningen. För mitt specifika behov spelade inte några tiondelsgrader någon roll.
Man hittar giss på adressen: http://data.giss.nasa.gov/gistemp/station_data/ .
Klicka på den lilla kartan på den del av jorden du är intresserad av så får du en lista över mätstationer i närheten av den position du klickade på. Jag klickade på Helsinki/Seutula och valde att ladda ner resultatet i textform. Jag fick då en fil jag döpte till ”station_helsinki.txt”. Början av filen ser ut så här:
YEAR JAN FEB MAR APR MAY JUN JUL AUG …
1950 999.9 999.9 999.9 999.9 999.9 999.9 999.9 999.9 …
1951 -6.5 -6.6 -6.2 3.0 6.8 13.0 14.7 17.5 …
1952 -2.2 -3.8 -7.9 3.3 6.4 12.9 15.4 13.6 …
1953 -4.6 -8.0 -0.7 4.2 8.4 16.2 16.3 15.0 …
1954 …
2012 -5.0 -8.1 -0.3 3.8 11.3 13.9 18.0 15.5 …
Det här borde ju vara enkelt att plocka in i ett kalkylark i mitt fall LibreOffice under Linux. Det visade sig dock att filformatet var ganska perverst med varierande antal mellanslag mellan olika datavärden vilket ledde till kaos i kalkylarket så att data för en specifik månad hamnade i olika kolumner … inte värt besväret att editera sextio års data för hand. Det är naturligtvis möjligt att jag skulle ha kunnat hitta på metoder att få LibreOffice att läsa in filen själv men varför bry sig då man kan skriva ett litet program som fixar problemet.
Jag beslöt att skriva ett litet program (skript) i programspråket Python så att jag ur giss datafil genererar 60 stycken filer med ett års data. Resultatet blir alltså 1952.dat, 1953.dat … 2012.dat . Jag valde att lämna bort 1950 eftersom det året i GISS databas helt saknar data, varför? Svar ingen aning. Året 1951 är ok men jag lämnade bort det för att kunna få jämnt 60 års temperaturer i min bild. År 2013 lämnades också bort eftersom det av naturliga skäl saknas några månader.
Ett Pythonprogram
Det är ofta en god idé att dokumentera vad man vill göra med programmet. Det är förvånande hur snabbt man glömmer bort vad avsikten med programmet var … bakgrundsinformationen ges med hjälp av kommentarer.
Den första raden hjälper operativsystemet att plocka fram Pythontolken. Rad två behövs i vår globala värld där det finns mängder av olika alfabet.
#!/usr/bin/python
# coding=Latin-1
# Name = make_dat.py
#
# This program changes a GISS text file to a regular .dat format that
# the plotting program Grace (xmgrace) can use.
# Author: Lars Silén 2013
#
Vi behöver två bibliotek för att hantera textfilen och för att skriva ut resultatet till filer.
Det första biblioteket ger oss effektiva verktyg för att hantera textsträngar och det andra för hantering av information från kommandoraden.
import string
import sys
Vi kontrollerar först att programmet har startats korrekt och att vi har fått en textfil att konvertera. Jag har inte brytt mig om att på djupet kontrollera att filen jag läser faktiskt är text … det skulle bli betydligt mera komplicerat då. Nu vet jag att filen är text eftersom jag har tittat på den med en texteditor.
if len(sys.argv) != 2:
print ”Usage: make_dat.py file_to_convert.txt”
exit(0)
Om filen vi vill konvertera saknas eller om många filer ges så stoppar programmet och förklarar vad det väntade sig.
Programmerare som har jobbat med äldre språk C, C++, Pascal etc. hajar antagligen till då man tittar på hur vi läser in filen från GISS.
file_name = sys.argv[1]
rdf = open(file_name,”r”)
lines = rdf.readlines()
rdf.close()
Vi tar filens namn från kommandoraden, öppnar den i läsmod och så läser vi in hela rasket i variabeln lines. I äldre språk skulle motsvarande operation ha varit betydligt mera komplicerat.
firstline = True
for line in lines:
items = line.split()
opline = ””
if firstline == True:
# The first line is text … Months
# we don’t need this information
firstline = False
else:
# The line starts the year for example 1992
# we don’t need the number of the year
first = True
for item in items:
if first != True:
if month < 13:
# These items are plain numbers
opline = str(month) + ” ” + item + ”\n”
wf = open(wrf, ”a”)
wf.write(opline)
wf.close()
print opline
month = month + 1
opline = ””
else:
first = False
wrf = item + ”.dat”
month = 1
Den första raden i textfilen behöver vi inte eftersom den innehåller månadernas namn i GISS tabellen, vi kastar bara bort den här informationen genom att helt enkelt inte bry oss om den.
Om man är van vid äldre programmeringsspråk så stöter man på följande helt förståeliga konstruktion men som inte nödvändigtvis finns i äldre språk. En for-slinga men där indexet är textraderna i den textmassa vi först läste in. Vi bearbetar helt enkelt en textrad i taget.
Varje testrad börjar med årtalet och fortsätter med medeltemperaturen i månaderna börjande från januari. Vi använder årtalet till att skapa filnamn för separata datafiler för de olika åren:
else:
first = False
wrf = item + ”.dat”
month = 1
Om vi tittar på det första elementet på en datarad så skapar vi ett filnamn från ifrågavarande årtal. För att inte blanda bort hateringen av månadsdata sätter vi first till False så att programmet kan detektera att det är månadsdata som behandlas.
# The line starts the year for example 1992
# we don’t need the number of the year
first = True
for item in items:
if first != True:
if month < 13:
# These items are plain numbers
opline = str(month) + ” ” + item + ”\n”
wf = open(wrf, ”a”)
wf.write(opline)
wf.close()
print opline
month = month + 1
opline = ””
Vi skriver ut en månad per rad i den skapade filen.
Programmet skapar en fil med följande format ex. 2012.dat :
1 -5.0
2 -8.1
3 -0.3
4 3.8
5 11.3
6 13.9
7 18.0
8 15.5
9 11.7
10 5.7
11 3.2
12 -6.7
Jag använder nu alla de skapade filerna utom åren 1986 (Tjernobyl!) och 2007 eftersom dessa år saknar vissa månadsmätvärden och detta ger upphov till fula spikar i bilden. De här åren har ingen betydelse för mitt argument och lämnas därför bort. Man kunde enkelt fixa problemet med att kasta bort månadsdata som är märkta 999.9 men detta lämnas som en övningsuppgift för läsaren.
Då programmet körs i teminal med kommandot
./make_dat.py station_helsinki.txt
produceras filerna
ls *.dat
1950.dat 1959.dat 1967.dat 1975.dat 1983.dat 1992.dat 2000.dat 2009.dat
1952.dat 1960.dat 1968.dat 1976.dat 1984.dat 1993.dat 2001.dat 2010.dat
1953.dat 1961.dat 1969.dat 1977.dat 1985.dat 1994.dat 2002.dat 2011.dat
1954.dat 1962.dat 1970.dat 1978.dat 1987.dat 1995.dat 2003.dat 2012.dat
1955.dat 1963.dat 1971.dat 1979.dat 1988.dat 1996.dat 2004.dat
1956.dat 1964.dat 1972.dat 1980.dat 1989.dat 1997.dat 2005.dat
1957.dat 1965.dat 1973.dat 1981.dat 1990.dat 1998.dat 2006.dat
1958.dat 1966.dat 1974.dat 1982.dat 1991.dat 1999.dat 2008.dat
Temperaturvariationen under åren 1952 till 2012 kan ritas upp med kommandot
xmgrace *.dat
Kommandot säger helt enkelt åt datorn att köra programmet xmgrace och att programmet skall rita upp alla filer med filtypen .dat d.v.s. filer där namnet slutar i .dat . Tecknet ‘*’ är ett såkallat ”Jokertecken” som egentligen betyder vilken som helst textsträng. Beteckningen *.dat betyder alltså 1952.dat 1953.dat … 2012.dat men det är betydligt trevligare att bara skriva *.dat.
Slutresultatet av övningen blir då:
De runda cirklarna, en skarpögd läsare ser dem eventuellt, som märker ut månadsdata för en årskurva har en diameter som motsvarar den totala uppvärmningen från 1900 till 2013 …
Läsaren får själv avgöra om skräckpropagandan vi matas med är relevant eller inte 😉 .
Etiketter: GISS, Grace, Nyheter Hbl inte vill att du skall känna till, programmering, Python, script, xmgrace
Kommentera