Seite 1 von 1

Zeitraum einer Datendatei mit Pandas einschränken

Verfasst: Mittwoch 11. Mai 2022, 10:53
von hawiwo
Hallo,
ich habe Dateien mit dem Zeilenformat:

...
2022-05-07 18:30:01 54.936426
...

Zwischen Zeit und Uhrzeit ist ein Leerzeichn und zwischen dem Wert ein TAB.

Korrekt einlesen kann ich die Daten offensichtlich.
print(dp.info()) gibt:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1079 entries, 0 to 1078
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 zeit 1079 non-null datetime64[ns]
1 gewicht 1079 non-null float64
dtypes: datetime64[ns](1), float64(1)
memory usage: 17.0 KB
None
----------------------------------------------------------------------------------------------------------------------------------------------------------
aus. Nur beim Versuch den Zeitbereich einzuschränken mit:
dat.loc[(pd.Timestamp(dat['zeit']) > start_date) & (pd.Timestamp(dat['zeit']) < end_date)]
tritt ein TypeError s.u. auf.
Wie geht das?

----------------------------------------------------------------------------------------------------------------------------------------------------------
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime

custom_date_parser = lambda x: datetime.strptime(x, "%Y-%m-%d %H:%M:%S")
dateCols = ['zeit']
dat = pd.read_csv("c:\\tmp\\data.dat", sep='\t', parse_dates=dateCols)
print(dat.info())
start_date = pd.to_datetime('6/5/2022 9:32')
end_date = pd.to_datetime('8/5/2018 9:32')

dat.loc[(pd.Timestamp(dat['zeit']) > start_date) & (pd.Timestamp(dat['zeit']) < end_date)]

----------------------------------------------------------------------------------------------------------------------------------------------------------
Ausgabe:
----------------------------------------------------------------------------------------------------------------------------------------------------------

Traceback (most recent call last):
File "C:\Users\hwolf\PycharmProjects\datetime\main.py", line 13, in <module>
dat.loc[(pd.Timestamp(dat['zeit']) > start_date) & (pd.Timestamp(dat['zeit']) < end_date)]
File "pandas\_libs\tslibs\timestamps.pyx", line 1399, in pandas._libs.tslibs.timestamps.Timestamp.__new__
File "pandas\_libs\tslibs\conversion.pyx", line 446, in pandas._libs.tslibs.conversion.convert_to_tsobject
TypeError: Cannot convert input [0 2022-05-07 17:50:00
1 2022-05-07 17:55:00
2 2022-05-07 18:00:01
3 2022-05-07 18:05:01
4 2022-05-07 18:10:01
...
1074 2022-05-11 11:20:01
1075 2022-05-11 11:25:01
1076 2022-05-11 11:30:01
1077 2022-05-11 11:35:01
1078 2022-05-11 11:40:01
Name: zeit, Length: 1079, dtype: datetime64[ns]] of type <class 'pandas.core.series.Series'> to Timestamp

Re: Zeitraum einer Datendatei mit Pandas einschränken

Verfasst: Mittwoch 11. Mai 2022, 11:44
von __blackjack__
@hawiwo: `pd.Timestamp()` kann halt nichts mit einem `Series`-Objekt anfangen. Das erwartet *einen* Wert als Argument und zwar laut Dokumentation etwas `datetime`-ähnliches, eine Zeichenkette, oder eine Zahl, entweder vom Typ `int` oder `float`. Und als Ergebnis wird dann ein `pd.Timestamp`-Objekt geliefert.

Was denkst Du denn wozu das gut sein sollte in dem Code? Laut Ausnahme haben die Werte in der Spalte ja bereits einen passenden Typ.

Re: Zeitraum einer Datendatei mit Pandas einschränken

Verfasst: Mittwoch 11. Mai 2022, 11:47
von derElch
Ungetestet / Idee:
Ich arbeite bei soetwas immer mit "masking"
Als Beispiel:

Code: Alles auswählen

mask = (data['date'].dt.year == 2022) & (data['date'].dt.month == 4) & (
    ~data['project_department'].isin(['abc']))

temp = data[mask].reset_index()
Daher die Frage, funktioniert es mit?

Code: Alles auswählen

date_mask = (dat['zeit']) > start_date) & (dat['zeit']) < end_date)
print(dat[date_mask])