J'ai un Dataframe qui ressemble (par exemple) à ceci:
df = df[~df.date.dt.weekday_name.isin(['Saturday','Sunday']).any(0)]
Je voudrais supprimer les lignes du Dataframe dont la colonne de date contient une date de week-end.
date high low close 0 2008-01-01 15.540 15.540 15.54 1 2008-01-02 15.750 15.210 15.25 2 2008-01-03 15.450 14.950 15.02 3 2008-01-04 14.990 14.400 14.48 4 <-- has been removed since 1/05/2008 is a Saturday 5 <-- has been removed since 1/06/2008 is a Sunday ....
J'ai essayé ceci:
print(df)
date high low close
0 2008-01-01 15.540 15.540 15.54
1 2008-01-02 15.750 15.210 15.25
2 2008-01-03 15.450 14.950 15.02
3 2008-01-04 14.990 14.400 14.48
4 2008-01-05 14.890 14.400 14.78
5 2008-01-06 14.890 14.400 14.78
....
mais cela ne fonctionne pas.
3 Réponses :
L'approche "plus simple" utiliserait dt.weekday (0 lundi, 6 dimanche)
date name 0 2019-01-01 Robert Baratheon 1 2019-01-02 Jon Snow 2 2019-01-03 Daenerys Targaryen 3 2019-01-04 Theon Greyjoy 6 2019-01-07 Sansa Stark
ou:
import pandas as pd
df = pd.DataFrame({
'date': pd.date_range(start='2019-01-01', end='2019-01-07'),
'name': [
'Robert Baratheon',
'Jon Snow',
'Daenerys Targaryen',
'Theon Greyjoy',
'Tyrion Lannister',
'Cersei Lannister',
'Sansa Stark'
]
})
df = df[df.date.dt.weekday < 5]
print(df)
Exemple complet:
df.query('date.dt.weekday < 5', inplace=True)
Renvoie:
df = df[df.date.dt.weekday < 5]
Vous pouvez créer une liste d'exclusion (au cas où vous voudriez ajouter d'autres jours) comme ceci:
df[~(pd.to_datetime(df['date']).dt.weekday_name.isin(day_exclusion))]
Le code ci-dessous convertit la colonne de date en un dtype datetime, ce qui était seulement nécessaire étant donné J'ai utilisé pd.read_clipboard () pour recréer votre dataframe (si votre dtype est déjà un datatime, vous pouvez supprimer la partie pd.to_datetime). Ensuite, il renvoie un cadre de données avec tous les jours ne figurant pas dans votre liste d'exclusion.
day_exclusion = ['Saturday', 'Sunday']
Résultats dans:
Ce morceau de code fonctionne parfaitement.
Il supprimera les enregistrements "samedi" et "dimanche" du dataframe
# *********** Removing weekend data from dataframe. ***************
df["weekday"] = pd.to_datetime(df.date).dt.dayofweek
no_weekend_data = df.drop(df.loc[df["weekday"] > 4].index)
Vous n'avez pas besoin de
any (0), utilisez simplementdf [~ df.date.dt.weekday_name.isin (['Saturday', 'Sunday'])].any (0)se réduit à une seule valeur booléenne (probablementTrue), alors que vous avez besoin d'un vecteur / tableau de booléens.Essayez ceci:
df = df [df.date.dt.weekday <5]Duh, merci jpp qui fonctionne.