Filtern von Pandas DataFrames nach Datumsangaben


156

Ich habe einen Pandas DataFrame mit einer Datumsspalte. Jetzt muss ich alle Zeilen im DataFrame herausfiltern, deren Daten außerhalb der nächsten zwei Monate liegen. Im Wesentlichen muss ich nur die Zeilen behalten, die innerhalb der nächsten zwei Monate liegen.

Was ist der beste Weg, um dies zu erreichen?

Antworten:


238

Wenn die Datumsspalte der Index ist , verwenden Sie .loc für die kennzeichnungsbasierte Indizierung oder .iloc für die Positionsindizierung.

Beispielsweise:

df.loc['2014-01-01':'2014-02-01']

Details finden Sie hier http://pandas.pydata.org/pandas-docs/stable/dsintro.html#indexing-selection

Wenn die Spalte nicht der Index ist , haben Sie zwei Möglichkeiten:

  1. Machen Sie es zum Index (entweder vorübergehend oder dauerhaft, wenn es sich um Zeitreihendaten handelt)
  2. df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]

Sehen Sie hier für die allgemeine Erklärung

Hinweis: .ix ist veraltet.


4
Danke, werde lesen. Das Datum ist eine separate Spalte und in meinem Fall nicht der Index. Ich hätte diese Informationen wahrscheinlich an erster Stelle geben sollen. Meine Frage war nicht sehr informativ.
AMM

42
Sie können auch queryhier verwenden. df.query('20130101 < date < 20130201').
Phillip Cloud

10
Sie sollten erwähnen, dass die Filter für Index (via .locund .ix) und Spalten in Ihren Beispielen nicht gleichwertig sind. df.ix['2014-01-01':'2014-02-01']enthält , 2014-02-01während df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]nicht enthalten 2013-02-01, es werden nur die Zeilen bis übereinstimmen 2013-01-31.
Rafael Barbosa

4
Dieser Anruf ist jetzt veraltet!
Mohamed Taher Alrefaie

6
Was ist, wenn man nicht nach einem Datumsbereich filtern möchte, sondern nach mehreren Datumsangaben?
Salem Ben Mabrouk

53

Die vorherige Antwort ist meiner Erfahrung nach nicht korrekt. Sie können keine einfache Zeichenfolge übergeben. Sie muss ein Datum / Uhrzeit-Objekt sein. So:

import datetime 
df.loc[datetime.date(year=2014,month=1,day=1):datetime.date(year=2014,month=2,day=1)]

16
Ich kann absolut einen String ohne Probleme übergeben.
Ninjakannon

9
ix Indexer ist veraltet, verwenden Sie loc - pandas.pydata.org/pandas-docs/stable/…
Nick

3
Pandas konvertiert jede "datetime" Zeichenfolge in ein datetime Objekt. Also ist es richtig
janscas

8
Ich erhalte den folgenden Fehler, wenn ich dies verwende: TypeError: '<' wird zwischen Instanzen von 'int' und 'datetime.date' nicht unterstützt
Haris Khaliq

41

Und wenn Ihre Daten durch Importieren eines datetime-Pakets standardisiert werden, können Sie einfach Folgendes verwenden:

df[(df['date']>datetime.date(2016,1,1)) & (df['date']<datetime.date(2016,3,1))]  

Mit dieser Funktion können Sie Ihre Datumszeichenfolge mit dem Datum / Uhrzeit-Paket standardisieren:

import datetime
datetime.datetime.strptime

5
Es wird empfohlen, zu verwenden df[(df['date']>pd.Timestamp(2016,1,1)) & (df['date']<pd.Timestamp(2016,3,1))].
Also S

20

Wenn Ihre datetime-Spalte den Datasetime-Typ Pandas hat (z. B. datetime64[ns]), benötigen Sie für eine ordnungsgemäße Filterung das Objekt pd.Timestamp , zum Beispiel:

from datetime import date

import pandas as pd

value_to_check = pd.Timestamp(date.today().year, 1, 1)
filter_mask = df['date_column'] < value_to_check
filtered_df = df[filter_mask]

14

Wenn die Daten im Index enthalten sind, dann einfach:

df['20160101':'20160301']

7

Mit pd.Timestamp können Sie eine Abfrage und eine lokale Referenz ausführen

import pandas as pd
import numpy as np

df = pd.DataFrame()
ts = pd.Timestamp

df['date'] = np.array(np.arange(10) + datetime.now().timestamp(), dtype='M8[s]')

print(df)
print(df.query('date > @ts("20190515T071320")')

mit der Ausgabe

                 date
0 2019-05-15 07:13:16
1 2019-05-15 07:13:17
2 2019-05-15 07:13:18
3 2019-05-15 07:13:19
4 2019-05-15 07:13:20
5 2019-05-15 07:13:21
6 2019-05-15 07:13:22
7 2019-05-15 07:13:23
8 2019-05-15 07:13:24
9 2019-05-15 07:13:25


                 date
5 2019-05-15 07:13:21
6 2019-05-15 07:13:22
7 2019-05-15 07:13:23
8 2019-05-15 07:13:24
9 2019-05-15 07:13:25

Schauen Sie sich die Pandas-Dokumentation für DataFrame.query an , insbesondere die Erwähnung des lokalen variabile-referenzierten udsing- @Präfixes. In diesem Fall wird auf die pd.TimestampVerwendung des lokalen Alias verwiesen ts, um eine Zeitstempelzeichenfolge angeben zu können


Könnten Sie einen Link zur Dokumentation der @ ts-Funktionen übergeben?
Glen Moutrie

6

Wenn wir also die CSV-Datendatei laden, müssen wir die Datumsspalte jetzt wie folgt als Index festlegen, um Daten basierend auf einem Datumsbereich zu filtern. Dies wurde für die jetzt veraltete Methode pd.DataFrame.from_csv () nicht benötigt.

Wenn Sie die Daten nur für zwei Monate von Januar bis Februar anzeigen möchten, z. B. 2020-01-01 bis 2020-02-29, können Sie dies tun:

import pandas as pd
mydata = pd.read_csv('mydata.csv',index_col='date') # or its index number, e.g. index_col=[0]
mydata['2020-01-01':'2020-02-29'] # will pull all the columns
#if just need one column, e.g. Cost, can be done:
mydata['2020-01-01':'2020-02-29','Cost'] 

Dies wurde für Python 3.7 getestet. Ich hoffe, Sie finden dies nützlich.


1
index_colmuss stringkeine Liste sein. mydata = pd.read_csv('mydata.csv',index_col='date')
Sharl Sherif

5

Wie wäre es mit pyjanitor

Es hat coole Funktionen.

Nach dem pip install pyjanitor

import janitor

df_filtered = df.filter_date(your_date_column_name, start_date, end_date)

2

Der kürzeste Weg, um Ihren Datenrahmen nach Datum zu filtern: Nehmen wir an, Ihre Datumsspalte ist der Typ datetime64 [ns]

# filter by single day
df = df[df['date'].dt.strftime('%Y-%m-%d') == '2014-01-01']

# filter by single month
df = df[df['date'].dt.strftime('%Y-%m') == '2014-01']

# filter by single year
df = df[df['date'].dt.strftime('%Y') == '2014']

1

Ich darf noch keine Kommentare schreiben, also schreibe ich eine Antwort, wenn jemand sie alle liest und diese erreicht.

Wenn der Index des Datasets eine Datums- / Uhrzeitangabe ist und Sie diese nur nach (zum Beispiel) Monaten filtern möchten, können Sie Folgendes tun:

df.loc[df.index.month = 3]

Dadurch wird der Datensatz bis März für Sie gefiltert.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.