Il existe un énorme dataframe contenant plusieurs types de données dans différentes colonnes. Je souhaite rechercher des lignes contenant des valeurs de date dans différentes colonnes. Voici un dataframe test:

   dt = pd.Series(['abc', datetime.now(), 12, '', None, np.nan, '2020-05-05'])
   dt1 = pd.Series([3, datetime.now(), 'sam', '', np.nan, 'abc-123', '2020-05-25'])
   dt3 = pd.Series([1,2,3,4,5,6,7])
   df = pd.DataFrame({"A":dt.values, "B":dt1.values, "C":dt3.values})

Maintenant, je souhaite créer un nouveau dataframe qui ne contient que des dates dans les deux colonnes A et B, ici les 2ème et dernière lignes.
Production attendue:

                            A                           B  C
1  2020-06-01 16:58:17.274311  2020-06-01 17:13:20.391394  2
6                  2020-05-05                  2020-05-25  7

Quelle est la meilleure façon de le faire? Merci.

P.S.> Les dates peuvent être dans n'importe quel format standard.

0
Vipool 1 juin 2020 à 15:08

3 réponses

Meilleure réponse

Utilisation:

m = df[['A', 'B']].transform(pd.to_datetime, errors='coerce').isna().any(axis=1)   
df = df[~m]

Résultat:

# print(df)
                            A                           B  C
1  2020-06-01 17:54:16.377722  2020-06-01 17:54:16.378432  2
6                  2020-05-05                  2020-05-25  7
2
Shubham Sharma 1 juin 2020 à 12:40
import pandas as pd
from datetime import datetime

dt = pd.Series(['abc', datetime.now(), 12, '', None, np.nan, '2020-05-05'])
dt1 = pd.Series([3, datetime.now(), 'sam', '', np.nan, 'abc-123', '2020-05-25'])
dt3 = pd.Series([1,2,3,4,5,6,7])
df = pd.DataFrame({"A":dt.values, "B":dt1.values, "C":dt3.values})

m = pd.concat([pd.to_datetime(df['A'], errors='coerce'),
               pd.to_datetime(df['B'], errors='coerce')], axis=1).isna().all(axis=1)

print(df[~m])

Tirages:

                            A                           B  C
1  2020-06-01 12:17:51.320286  2020-06-01 12:17:51.320826  2
6                  2020-05-05                  2020-05-25  7
0
Andrej Kesely 1 juin 2020 à 12:18

Solution pour le test uniquement A,B colonnes est { {X1}} avec { {X2}} et { {X3}} pour ne correspondre à aucune heure non datée:

df = df[df[['A','B']].apply(pd.to_datetime, errors='coerce').notna().all(axis=1)]

print (df)
                            A                           B  C
1  2020-06-01 16:14:35.020855  2020-06-01 16:14:35.021855  2
6                  2020-05-05                  2020-05-25  7
1
jezrael 1 juin 2020 à 14:15