Kann jemand etwas Licht ins Dunkel bringen, warum ich anhand meiner Suchkriterien im Datumsformat keine Zeile aus der .loc-Operation finden kann?

import yfinance as yf
import matplotlib.pyplot as plt
import pandas as pd
import os
import numpy as np

stockCode = 'AAPL'
data = yf.download(stockCode, '2014-10-20', '2015-01-27')


#dfClose = pd.DataFrame(data.Close.values)
dfOpen = pd.DataFrame(data.Open.values)


dflist = dfOpen.values    
dfClose = pd.DataFrame({"open": data.Open.values,
                            "year": data.Close.index.year.values,
                         "month":  data.Close.index.month.values,
                        "day":  data.Close.index.day.values,
                            "date": data.Close.index.date})

dfClose[0:5]

open    year    month   day date
0   98.320000   2014    10  20  2014-10-20
1   103.019997  2014    10  21  2014-10-21
2   102.839996  2014    10  22  2014-10-22
3   104.080002  2014    10  23  2014-10-23
4   105.180000  2014    10  24  2014-10-24

RETURNING EMPTY FRAME
dfClose.loc[dfClose['date'] == "2014-10-21"]
open    year    month   day date

Also trying a date range but no luck
dfClose.loc['2014-10-21':'2014-10-24']
open    year    month   day date

Dies scheint zu funktionieren, wenn ich später eine Variable verwende. Liegt das daran, dass es sich in einem np-Array befindet?

floating_Max = np.amax(dflist)
print ("Max\n", dfClose.loc[dfClose['open'] == floating_Max])
Max
           open  year  month  day        date
28  119.269997  2014     11   28  2014-11-28
0
maclian 23 Feb. 2020 im 19:33

3 Antworten

Beste Antwort

Ich denke, die Spalte date ist ein object Typ in dfClose. Versuchen Sie Folgendes, um es in datetime64 zu konvertieren -

dfClose['date'] = pd.to_datetime(dfClose['date'], format='%Y-%m-%d')

Das dfClose.loc[dfClose['date'] == "2014-10-21"] sollte jetzt funktionieren.

Wenn Sie .loc nach einem Datumsbereich anwenden möchten, muss die Spalte date nach der Konvertierung in den Typ datetime64 möglicherweise als Index festgelegt werden. Versuchen Sie dazu Folgendes:

dfClose = dfClose.set_index('date')

Der Befehl dfClose.loc['2014-10-21':'2014-10-24'] sollte dann funktionieren.

0
Sajan 23 Feb. 2020 im 17:05

df.loc Indizes für den Indexnamen. Wenn Sie also dfClose.loc[dfClose['date'] == "2014-10-21"] schreiben, übergeben Sie eine Reihe von Bools an loc. Das ist der Fehler. Was Sie tun können, ist dfClose[dfClose['date'] == "2014-10-21"], um die Zeilen abzurufen, in denen das Datum mit dieser Zeichenfolge übereinstimmt (achten Sie auf den Typ der Werte, wenn Sie ein str mit einem datetime vergleichen, wird nicht das zurückgegeben, was Sie erwarten )

0
dzang 23 Feb. 2020 im 16:45

+1 bis @erips dachte. Hier ist, was ich zum Filtern mache, wenn der Typ pandas datetime ist (meine Vermutung, um welchen Typ es sich handelt).

date_to_check = pd.Timestamp(2019, 3, 20)
filter_mask = df['Date'] > date_to_check
df_filtered=df[filter_mask]

Wenn es sich aus irgendeinem Grund noch nicht um ein Datum / Uhrzeit-Objekt handelt, können Sie es als solches umwandeln:

df['Date'] = pd.to_datetime(df['Date'])
0
mmcguffi 23 Feb. 2020 im 16:45