Programmering i språket Python

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å:

temp_Helsinki_Vantaa_1952-2012

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: , , , , , ,

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com-logga

Du kommenterar med ditt WordPress.com-konto. Logga ut /  Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut /  Ändra )

Ansluter till %s


%d bloggare gillar detta: