Finden des letzten Tags des Monats in einer Liste

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
Samoth
User
Beiträge: 41
Registriert: Freitag 24. November 2017, 15:13

Hallo,
ich möchte gerne aus einer Liste den Index vom letzten Tag jeden Monats auslesen.

Leider bekomme ich bei meinen versuchen folgenden Fehler:

Code: Alles auswählen

AttributeError: 'RangeIndex' object has no attribute 'month'
Angefangen habe ich so:

Code: Alles auswählen

temp=pandas.read_csv(filename, delimiter=',')
dates=pandas.to_datetime(temp['Var1'])
Daraus bekomme ich eine Liste:

Code: Alles auswählen

0      2017-01-01 06:00:00
1      2017-01-01 07:00:00
2      2017-01-01 08:00:00
...

Name: Var1, Length: 4053, dtype: datetime64[ns]
Mit Hilfe des Befehls

Code: Alles auswählen

dates[dates.groupby(dates.index.month).apply(lambda s: np.max(s.index))].tolist()
sollte ich den letzten Index jedes Monats bekommen.

Kann mir da jemand weiterhelfen?

Gruß
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Ich kenne mich mit Pandas nicht aus. Mit Python schon.
Meine Vermutung ist, dass es mit Pandas noch viel einfacher sein könnte.

Mal angenommen du hast eine Liste mit datetime objekten.
Um ein paar zufällige Daten zu generieren, hab ich eine kleine Funktion geschrieben.

Code: Alles auswählen

import random
import datetime


def get_rnd_date():
    while True:
        year = 2018
        month = random.randint(1, 12)
        day = random.randint(1,31)
        try:
            date = datetime.datetime(year, month, day)
        except ValueError:
            continue
        else:
            return date

dates = [get_rnd_date() for _ in range(100)]
Nun hast du Beispieldaten in dates, unsortiert.

Um mit itertools.groupby zu arbeiten, muss die Liste zuerst sortiert werden.
Dann kann man nach 'month' gruppieren.
So wie die sorted Funktion, hat auch groupby ein Argument für key.
Der key gibt an, nach was sortiert, bzw. gruppiert werden soll.

Um lambda zu vermeiden, kann man operator verwenden.
Der attrgetter ist genau das was du brauchst, um auf Attribute der Klassen zuzugreifen.
Die Funktion liefert eine Funktion zurück, die als Argument das Objekt erwartet, auf dessen Attribut zugegriffen werden soll.

Code: Alles auswählen

from itertools import groupby
from operator import attrgetter


sorted_dates = sorted(dates)
grouped_dates = groupby(sorted_dates, key=attrgetter('month'))
Nun kannst du die Ergebnisse ausgeben:

Code: Alles auswählen

for month, grouped in grouped_dates:
    last_day = list(grouped)[-1]
    # oder alternativ argument unpacking
    # *_, last = grouped
    print('Month:', month, 'last_date', last_day)
Nicht vergessen, dass nach dieser for-Schleife grouped aufgebraucht ist.
Der Trick dabei ist, das gruppierte mit list zu "konsumieren" um dann daraus das letzte Element auszugeben.
Da die Liste immer noch sortiert ist, braucht man das nicht noch einmal zu tun.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten