Format von 60 auf 100'ter Einheit

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Omm
User
Beiträge: 90
Registriert: Samstag 7. April 2018, 14:05

Hallo zusammen
gibt es in pandas(dataframe) eine einfache Möglichkeit die Zeit (timedelta64[ns]) in eine 100 Einheit umzuwandeln?
Beispiel: 10.30 auf 10,50

Code: Alles auswählen

       	# Data Bereich setzen
       	mask = (data[self.DATUM_ZEIT] >= start_date) & (data[self.DATUM_ZEIT] <= end_date)
        data = data.loc[mask]        
        perweek = data.groupby(by=[data[self.DATUM_ZEIT].dt.strftime('%W'), self.KOSTENSTELL]).sum()
        perweek = perweek.reset_index()
        # Format auf 'h,m' anpassen
        perweek[self.DURATION] = perweek[self.DURATION].apply(lambda x: f'{x.components.hours:2d},'f'{x.components.minutes:2d}' if not pd.isnull(x) else '')
Jeden Eintrag durchlaufen und umwandeln ist die Alternative, jedoch denke ich, dass es eine bessere Lösung gibt also wie nachstehend.

Code: Alles auswählen

    def humanize_time(self, secs):
        secs = abs(secs)
        mins, secs = divmod(secs, 60)
        hours, mins = divmod(mins, 60)
        mins = mins / 3 * 5
        return '%2d,%02d' % (hours, mins)
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast schon eine Dezimalzeit, und zwar Nanosekunden.
Wenn Du also Nanosekunden in Stunden umrechnen willst, mußt Du die Spalte nur in float umwandeln und durch 3.6e12 teilen.
Omm
User
Beiträge: 90
Registriert: Samstag 7. April 2018, 14:05

eigentlich simpel, wenn man den Durchblick hat.
Vielen Dank

Code: Alles auswählen

perweek[self.DURATION] = (perweek[self.DURATION].dt.total_seconds() / 3600).map('{:,.2f}'.format)
 
Kannst du mir bitte sagen, wie den Punkt durch das Komma ersetzen kann.
So wie ich das machen würde geht es nicht.
Omm
User
Beiträge: 90
Registriert: Samstag 7. April 2018, 14:05

ich habe es nun wie nachstehend gelöst. Dies ist sicherlich nicht die beste Lösung.

Code: Alles auswählen

perweek[self.DURATION] = (perweek[self.DURATION].dt.total_seconds() / 3600).map('{:.2f}'.format).map(lambda x: str(x.replace('.', ',')))
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Omm: Der `str()`-Aufruf ist überflüssig, denn `format()` liefert ja bereits eine Zeichenkette, und man könnte das natürlich auch in *einem* Aufruf erledigen.

Code: Alles auswählen

        perweek[self.DURATION] = (
            perweek[self.DURATION].dt.total_seconds() / 3600
        ).apply(lambda x: format(x, "{:.2f}").replace(".", ","))
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Omm
User
Beiträge: 90
Registriert: Samstag 7. April 2018, 14:05

@__blackjack__ Vielen Danke für deine HIlfe
ich habe deinen Vorschlag reingemacht. Bei mir erscheint eine Fehlermeldung. 'ValueError: Invalid format specifier'
Wie nachstehend klappt es. Keine Ahnung was f' macht, format(), also dein Beispiel, kann ich nachvollziehen.

Code: Alles auswählen

perweek[self.DURATION] = (perweek[self.DURATION].dt.total_seconds() / 3600).apply(lambda x: f'{x:.2f}'.replace('.', ','))
Vielen Dank
Antworten