2017-05-24 3 views
3

Ich würde gerne wissen, wie man verschiedene Daten auf allen verschiedenen Zeitniveaus filtert, d. H. Daten nach Jahr, Monat, Tag, Stunde, Minute und/oder Tag findet. Wie finde ich zum Beispiel alle Daten, die 2014 oder 2014 im Januar oder nur am 2. Januar 2014 oder ... bis zur zweiten stattgefunden haben?Filtern und Vergleichen von Datumsangaben mit Pandas

So habe ich mein Datum und Uhrzeit Datenrahmen erzeugt aus pd.to_datetime

df 
    timeStamp 
0 2014-01-02 21:03:04 
1 2014-02-02 21:03:05 
2 2016-02-04 18:03:10 

Also, wenn ich bis zum Jahr 2014 auswählen, dann würde ich als Ausgang hat:

timeStamp 
0 2014-01-02 21:03:04 
1 2014-02-02 21:03:05 

Oder wie ein anderes Beispiel Ich möchte die Daten wissen, die 2014 und am 2. eines jeden Monats passiert sind. Dies würde auch dazu führen, in:

timeStamp 
0 2014-01-02 21:03:04 
1 2014-02-02 21:03:05 

Aber wenn ich für ein Datum, das geschah am 2. Januar 2014

timeStamp 
0 2014-01-02 21:03:04 

gefragt Wie kann ich das erreichen auf allen Ebenen?

Wie vergleichen Sie auch Daten auf diesen verschiedenen Ebenen, um ein Array von booleschen Indizes zu erstellen?

Antwort

2

Sie können Ihre Datenrahmen über boolean Indizierung wie so filtern:

df.loc[df['timeStamp'].dt.year == 2014] 
df.loc[df['timeStamp'].dt.month == 5] 
df.loc[df['timeStamp'].dt.second == 4] 
df.loc[df['timeStamp'] == '2014-01-02'] 
df.loc[pd.to_datetime(df['timeStamp'].dt.date) == '2014-01-02'] 

... und so weiter und so fort.

+0

Vielen Dank für die Antwort. Die ersten drei arbeiten, aber nicht die vierte, die einen leeren Datenrahmen generiert. Das ist das Problem, über das ich gestolpert bin, aber ich wollte es auf jeden Teil des Datums und der Zeit und auf alle möglichen Kombinationen verallgemeinern. –

+0

Das leere df zeigt an, dass zu diesem Datum keine Datensätze vorhanden sind. Hast du versucht, es mit dem zu ersetzen, nach dem du suchst? –

+0

Ja, ich habe es versucht und es hat nicht funktioniert, hat es für Sie funktioniert? Ich denke, es kann daran liegen, dass sie nicht genau das gleiche Datum haben. Man hat eine bestimmte Stunde: Minute: Zeit assoziiert und die andere nicht, aber ich bin mir nicht sicher, ob das Tru ist. –

1

Wenn Sie Zeitstempel als Index und dtype als Datetime eingestellt einen DateTimeIndex zu bekommen, dann können Sie die folgende Partial String Indexing Syntax:

df['2014'] # gets all 2014 
df['2014-01'] # gets all Jan 2014 
df['01-02-2014'] # gets all Jan 2, 2014 
+0

Wie wäre es mit dem 2. eines jeden Monats im Jahr 2014? –

+1

df [(df.index.year == 2014) & (df.index.day == 2)] Dann musst du zurück zur booleschen Indizierung gehen, ähnlich wie Andrew L, aber ein wenig anders, da die Zeit in deinem Index ist , Sie benötigen den .dt-Accessor nicht. –

+0

Danke! In diesem Sinne sehe ich nicht den Vorteil des Index gegenüber der Booleschen Indexierung. –

1

Ich würde nur eine String-Serie erstellen, dann str.contains() verwenden, mit Platzhaltern. Das gibt Ihnen die Granularität, nach der Sie suchen.

s = df['timeStamp'].map(lambda x: x.strftime('%Y-%m-%d %H:%M:%S')) 

print(df[s.str.contains('2014-..-.. ..:..:..')]) 
print(df[s.str.contains('2014-..-02 ..:..:..')]) 
print(df[s.str.contains('....-02-.. ..:..:..')]) 
print(df[s.str.contains('....-..-.. 18:03:10')]) 

Ausgang:

 timeStamp 
0 2014-01-02 21:03:04 
1 2014-02-02 21:03:05 
     timeStamp 
0 2014-01-02 21:03:04 
1 2014-02-02 21:03:05 
     timeStamp 
1 2014-02-02 21:03:05 
2 2016-02-04 18:03:10 
     timeStamp 
2 2016-02-04 18:03:10 

Ich denke, das auch Ihre Frage zu boolean Indizes löst:

print(s.str.contains('....-..-.. 18:03:10')) 

Ausgang:

0 False 
1 False 
2  True 
Name: timeStamp, dtype: bool 
Verwandte Themen