Seite 1 von 1
Gruppierung von Dateien durch Datum
Verfasst: Dienstag 5. November 2013, 19:34
von PaulchenPanther
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))
Re: Gruppierung von Dateien durch Datum
Verfasst: Dienstag 5. November 2013, 20:01
von mutetella
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
Re: Gruppierung von Dateien durch Datum
Verfasst: Dienstag 5. November 2013, 20:24
von PaulchenPanther
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.
Re: Gruppierung von Dateien durch Datum
Verfasst: Dienstag 5. November 2013, 21:19
von mutetella
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
Re: Gruppierung von Dateien durch Datum
Verfasst: Dienstag 5. November 2013, 21:41
von 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.
Re: Gruppierung von Dateien durch Datum
Verfasst: Mittwoch 6. November 2013, 03:04
von PaulchenPanther
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.
Re: Gruppierung von Dateien durch Datum
Verfasst: Mittwoch 6. November 2013, 08:06
von mutetella
@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
Re: Gruppierung von Dateien durch Datum
Verfasst: Mittwoch 6. November 2013, 08:56
von snafu
@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=': ')
Re: Gruppierung von Dateien durch Datum
Verfasst: Donnerstag 7. November 2013, 21:21
von PaulchenPanther
@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.
Re: Gruppierung von Dateien durch Datum
Verfasst: Freitag 8. November 2013, 00:26
von snafu
Ok, Wörterbücher an sich nicht. Aber halt die Ausgaben von Wörterbüchern.