J'écris une fonction qui traite un dataframe. Les lignes de ce dataframe sont indexées par un index datetime et il y a une ligne par heure dans le dataframe. En gros, après avoir effectué quelques traitements, voici ce que j'ai:

                     inquinante  temperatura  precipitazioni  ...  umidita  day_of_year  day_of_week
Data                                                          ...                                   
2000-07-04 00:00:00        55.0         23.9             0.0  ...     86.8          186            1
2000-07-04 01:00:00         NaN         23.4             0.0  ...     86.2          186            1
2000-07-04 02:00:00         NaN         22.7             0.0  ...     92.5          186            1
2000-07-04 03:00:00         NaN         22.1             0.0  ...     97.5          186            1
2000-07-04 04:00:00         NaN         22.2             0.0  ...     95.9          186            1

Maintenant, je veux filtrer les lignes pour lesquelles la valeur de la colonne 'inquinante' est NaN, j'ai donc écrit la ligne de code suivante:

df = df.dropna(subset=["inquinante"])

Mais ce que j'obtiens après son exécution est le suivant:

           inquinante  temperatura  precipitazioni  ...    umidita  day_of_year  day_of_week
Data                                                 ...                                     
2014-01-31        25.0     4.700000        1.000000  ...  95.700000           31            4
2014-02-01        31.0     5.800000        0.000000  ...  94.800000           32            5
2014-02-02        20.0     6.100000        1.800000  ...  97.300000           33            6
2014-02-03        17.0     6.700000        0.600000  ...  96.300000           34            0
2014-02-04        18.0     6.600000        0.800000  ...  97.200000           35            1

Pourquoi maintenant mes dates sont regroupées par jours et non par heures comme avant? J'ai également essayé de changer la ligne de code en:

df = df[df.inquinante >= 0]
#or
df = df[df.inquinante.notna()]

Mais aucun de ceux-ci ne semblait résoudre le problème. Est-il possible de résoudre ce problème et d'empêcher les pandas de regrouper mes dates?

Merci d'avance

0
BelottiGhilardi 3 juin 2020 à 20:18

3 réponses

Meilleure réponse

Il s'agit de la représentation automatique d'un index datetime lorsque toutes les étiquettes d'index ont minuit ou l'heure 00:00:00 comme horodatage.

df = pd.DataFrame({'value':np.arange(20)}, index=pd.date_range('2020-02-01', periods=20, freq='12H'))
df 

Production:

                     value
2020-02-01 00:00:00      0
2020-02-01 12:00:00      1
2020-02-02 00:00:00      2
2020-02-02 12:00:00      3
2020-02-03 00:00:00      4
2020-02-03 12:00:00      5
2020-02-04 00:00:00      6
2020-02-04 12:00:00      7
2020-02-05 00:00:00      8
2020-02-05 12:00:00      9
2020-02-06 00:00:00     10
2020-02-06 12:00:00     11
2020-02-07 00:00:00     12
2020-02-07 12:00:00     13
2020-02-08 00:00:00     14
2020-02-08 12:00:00     15
2020-02-09 00:00:00     16
2020-02-09 12:00:00     17
2020-02-10 00:00:00     18
2020-02-10 12:00:00     19

Maintenant, abandonnons tout le temps où heure == 12 ne laissant que l'horodatage de minuit:

df[df.index.hour != 12]

Production:

            value
2020-02-01      0
2020-02-02      2
2020-02-03      4
2020-02-04      6
2020-02-05      8
2020-02-06     10
2020-02-07     12
2020-02-08     14
2020-02-09     16
2020-02-10     18

C'est toujours un datetimeindex et chaque étiquette a un horodatage.

df[df.index.hour != 12].index.strftime('%Y-%m-%d %H:%M:%S')

Production:

Index(['2020-02-01 00:00:00', '2020-02-02 00:00:00', '2020-02-03 00:00:00',
       '2020-02-04 00:00:00', '2020-02-05 00:00:00', '2020-02-06 00:00:00',
       '2020-02-07 00:00:00', '2020-02-08 00:00:00', '2020-02-09 00:00:00',
       '2020-02-10 00:00:00'],
      dtype='object')
1
Scott Boston 3 juin 2020 à 17:33

Si seul le format de votre date a changé et non les valeurs, vous pouvez toujours la reconvertir comme suit:

df['Date'] = df['Date'].dt.strftime('%Y-%m-%d %H:%M:%S')
1
LazyCoder 3 juin 2020 à 17:35

Vous pouvez essayer quelque chose comme ça -

temp = df.reset_index()
temp = temp[temp['inquinante'].notna()].set_index('Data')
1
Sajan 3 juin 2020 à 17:29