1
votes

Pandas: supprimez les lignes avec des valeurs inférieures à aujourd'hui en utilisant np.where ()?

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


2 commentaires

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.


4 Réponses :


1
votes
>>> 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

2 commentaires

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 ?



1
votes

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.


0 commentaires

1
votes

Nous pouvons faire

df[(df.Year*100+df.Week)<int(pd.to_datetime('today').strftime('%Y%W'))]


0 commentaires

1
votes

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


2 commentaires

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 (' 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