Compte tenu de l'ensemble de données suivant et de la semaine en cours 2019 / W37 , comment supprimer des lignes antérieures à la semaine en cours à l'aide de np.where ?
import pandas as pd
import numpy as np
from datetime import datetime
data = {
"Year": [2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019],
"Week": [31, 32, 33, 34, 35, 36, 37, 38, 39, 40],
"Value": [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
}
df = pd.DataFrame(data)
print(df)
YearWeek = datetime.now().strftime("%Y/W%V")
print(YearWeek)
df["Exclude"] = np.where(str(df["Year"] + "/" + df["Week"]) < YearWeek, "Yes", "No")
print(df)
J'ai essayé ce qui suit:
Year Week Value 0 2019 31 10 1 2019 32 20 2 2019 33 30 3 2019 34 40 4 2019 35 50 5 2019 36 60 6 2019 37 70 7 2019 38 80 8 2019 39 90 9 2019 40 100
4 Réponses :
>>> print(df)
Year Week Value
0 2019 31 10
1 2019 32 20
2 2019 33 30
3 2019 34 40
4 2019 35 50
5 2019 36 60
6 2019 37 70
7 2019 38 80
8 2019 39 90
9 2019 40 100
>>> today = pd.to_datetime('today')
>>> today
Timestamp('2019-09-12 22:54:46.039542')
>>> df[(df.Week < today.week) | (df.Year < today.year)]
Year Week Value
0 2019 31 10
1 2019 32 20
2 2019 33 30
3 2019 34 40
4 2019 35 50
5 2019 36 60
Après la question du PO, il doit être df [~ (...)]
Cela devrait-il être uniquement | ou & étant donné que vous aurez la date du jour, par exemple, 01/03/2020 ?
Vous pouvez utiliser un système de semaine décimale:
Year Week Value 6 2019 37 70 7 2019 38 80 8 2019 39 90 9 2019 40 100
Résultat
w = df['Year'] + df['Week'] / 54 now = pd.Timestamp.now() this_week = now.year + now.week / 54 df[w >= this_week]
Dans le ISO Date System , une année peut avoir jusqu'à 53 semaines donc nous utilisons 54 pour éviter que la dernière semaine de l'année N apparaisse comme l'année N + 1 . Tout ce qui dépasse 54 fonctionne aussi bien. C'est juste un moyen pour nous de combiner l'année et la semaine en une seule quantité comparable.
Nous pouvons faire
df[(df.Year*100+df.Week)<int(pd.to_datetime('today').strftime('%Y%W'))]
essayez ceci:
df['exclude'] = np.where(pd.to_datetime((df["Year"].astype(str) + "/W" + df["Week"].astype(str)), format="%Y/W%V", errors='ignore') < YearWeek, 'Yes', 'No' )
ou en utilisant np.where ()
df.iloc[np.where(pd.to_datetime((df["Year"].astype(str) + "/W" + df["Week"].astype(str)), format="%Y/W%V", errors='ignore') >= YearWeek )]
Pour générer la colonne d'exclusion:
XXX
Je ne sais pas pourquoi, mais j'obtiens l'erreur suivante - numpy.core._exceptions.UFuncTypeError: ufunc 'add' ne contenait pas de boucle avec des types de correspondance de signature (dtype ('
vos temps sont importés comme un int. sur ce df particulier, vous devrez changer df ['year'] et df ['Week'] en chaînes pour que cela fonctionne
Pourquoi voulez-vous faire cela avec np.where? aussi pourquoi avez-vous besoin du format de chaîne spécifique? Jusqu'à présent, aucune réponse ne répond à vos besoins spécifiques
J'ai utilisé np.where dans le script, car c'est l'un des moyens les plus rapides de faire une boucle avec des conditions.