Gruppierung von Dateien durch Datum

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
PaulchenPanther
User
Beiträge: 16
Registriert: Freitag 13. Juli 2012, 17:17

Hallo zusammen,

kann mir bitte jemand Tipps zu folgender Problemstellung geben. Ich habe eine Reihe von Datenfiles in einem Verzeichnis, die atmosphaerische Messdaten enthalten. Das Format ist NetCDF4.
Ich kann die Daten lesen und auch plotten (z. B. temp vs altitude). Als naechstes muss ich die Daten danach sortieren, wann sie aufgenommen wurden (pro Tag gibt es vier einzelne Files, manchmal aber auch weniger)
und alle Daten eines Messtages gemeinsam plotten um so ein Gefuehl fuer die taegliche Entwicklung des Temp.verlaufs zu bekommen. Wie macht man das
am geschicktesten? Jedes einzelne File hat einen Zeitstempel (Variable "basetime") Wie kann ich diese geschickt benutzen um ans Ziel zu kommen?

Code: Alles auswählen

from netCDF4 import Dataset
for f in listdir(path):
    if isfile(join(path,f)):
        full_path = join(path,f)
        f = Dataset(full_path, 'r')
        basetime = f.variables['base_time'][:]
        altitude = f.variables['alt'][:]
        temp = f.variables['tdry'][:]
        actual_date =  strftime("%Y-%m-%d %H:%M:%S", gmtime(basetime))
        measurement_day =  strftime("%Y-%m-%d", gmtime(basetime))
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

Du kannst doch den `base_time` Wert direkt zum Sortieren verwenden:

Code: Alles auswählen

In [1]: class ExampleFile(object):
   ...:     def __init__(self, base_time):
   ...:         self.base_time = base_time
   ...:         
In [2]: import datetime

In [3]: files = [ExampleFile(datetime.date(2010, 10, 8)), ExampleFile(datetime.date(2010, 10, 4)), ExampleFile(datetime.date(2010, 10, 12))]

In [4]: for file in sorted(files, key=lambda f: f.base_time):
   ...:     print file.base_time
   ...:     
2010-10-04
2010-10-08
2010-10-12
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
PaulchenPanther
User
Beiträge: 16
Registriert: Freitag 13. Juli 2012, 17:17

Hallo mutetella,

danke fuer deine schnelle Hilfe. Ich kann deinen Code einigermassen nachvollziehen und verstehe ungefaehr, in welche Richtung es geht. Ich bin aber noch ganz schoener Python-Anfaenger. Ich glaube, es wuerde mir helfen, wenn du zu deinem Code etwas erklaeren koenntest. Mir gelingt es nicht, das auf mein komplexeres Problem zu uebertragen. Danke schon mal vorab fuer deine Hilfe.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Du möchtest `Dataset` Exemplare nach dem jeweiligen Zeitstempel, auf den das Attribut `variables['base_time']` verweist, sortieren.
Dafür bietet sich eben die builin Funktion `sorted` an. Du übergibst also eine Liste der zu sortierenden Exemplare an `sorted` und gibst über das `key` Argument eine Funktion an, welche wiederum die Werte, die zur Sortierung verwendet werden sollen, zurückgibt. Sehr oft wird hier `lambda` verwendet, wenn es nur darum geht, ein Attribut abzufragen. Am besten, Du schaust Dir mal die Dokumentation dazu an.

In meinem Beispiel habe ich eine Klasse `ExampleFile` erstellt, die letzlich nur Dein `Dataset` simulieren soll.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

Und wenn man die nach Datum sortierten Daten dann nah Tagen gruppieren möchte, sollte man einen Blick auf `itertools.groupby()` werfen.

Statt des ``lambda`` hätte man beim sortieren übrigens auch `operator.attrgetter()` verwenden können um eine `key`-Funktion zu erstellen.
PaulchenPanther
User
Beiträge: 16
Registriert: Freitag 13. Juli 2012, 17:17

Hallo,
danke fuer euere Kommentare und Hilfen. Ich habe das Ganze jetzt mit einem Dictionary geloest mit measurement_day als key. Damit klappt es auch.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@PaulchenPanther: Ein dictionary gibt Dir die Werte aber nicht zwingend in derselben Reihenfolge zurück, wie Du sie dort erstellst:

Code: Alles auswählen

>>> d = {'0': 'null', '1': 'eins', '2': 'zwei', '3': 'drei', '4': 'vier', '5': 'fünf'}
>>> for key, value in d.iteritems():
...     print key, value
... 
1 eins
0 null
3 drei
2 zwei
5 fünf
4 vier
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@mutella: Ich vermute, das `dict` wurde vor allem wegen der Gruppierung verwendet. Also im Grunde in der Art, wie man das eigentlich via `defaultdict()` bzw dem schon von BlackJack ins Spiel gebrachten `groupby()` machen würde. Das Problem der nicht vorhandenen Sortierung hat man ja recht schnell gelöst, da sich auch Wörterbücher ohne großen Aufwand sortieren lassen.

Insgesamt sähe das dann in etwa so aus (ungetestet):

Code: Alles auswählen

from __future__ import print_function

import collections
import os
import time

import netCDF4

files = collections.defaultdict(list)
for f in os.listdir(path):
    if os.path.isfile(join(path,f)):
        full_path = os.path.join(path,f)
        f = netCDF4.Dataset(full_path, 'r')
        basetime = f.variables['base_time'][:]
        altitude = f.variables['alt'][:]
        temp = f.variables['tdry'][:]
        actual_date =  time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(basetime))
        measurement_day =  time.strftime("%Y-%m-%d", time.gmtime(basetime))
        files[measurement_day].append(f)

for mday, files_from_day in sorted(files.items()):
    print(mday, files_from_day, sep=': ')
PaulchenPanther
User
Beiträge: 16
Registriert: Freitag 13. Juli 2012, 17:17

@mutetella: Danke fuer den Hinweis, dass ein dictionary die Werte unsortiert zurueckgibt. Mir ging es um die Gruppierung nach Messtagen und wie snafu richtig geschrieben hat, lassen sich auch Woerterbuecher sortieren. Damit komme ich im Moment einfach besser klar. Dass es anders vielleicht eleganter ist, gebe ich zu. Dafuer bin ich aber (noch) zu unerfahren.
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ok, Wörterbücher an sich nicht. Aber halt die Ausgaben von Wörterbüchern.
Antworten