Πώς να εντοπίσετε αυτόματα τις στήλες ημερομηνίας/ώρας και να ορίσετε τον τύπο δεδομένων τους όταν διαβάζετε ένα αρχείο CSV σε Pandas

Κόμβος πηγής: 1106147

Πώς να εντοπίσετε αυτόματα τις στήλες ημερομηνίας/ώρας και να ορίσετε τον τύπο δεδομένων τους όταν διαβάζετε ένα αρχείο CSV σε Pandas

Όταν το read_csv( ) διαβάζει π.χ. "2021-03-04" και "2021-03-04 21:37:01.123" ως απλούς τύπους δεδομένων "αντικειμένου", συχνά μπορείτε απλώς να τους μετατρέψετε αυτόματα όλους ταυτόχρονα σε πραγματικούς τύπους δεδομένων ημερομηνίας.


By David B Rosen (PhD), Επικεφαλής Επιστήμονας Δεδομένων για Αυτοματοποιημένη Έγκριση Πιστώσεων στην IBM Global Financing



Ας υποθέσουμε ότι έχω ένα αρχείο δεδομένων CSV που θέλω να διαβάσω σε ένα πλαίσιο δεδομένων Pandas και ορισμένες από τις στήλες του είναι ημερομηνίες ή ημερομηνίες, αλλά δεν θέλω να μπω στον κόπο να προσδιορίσω/καθορίζω τα ονόματα αυτών των στηλών εκ των προτέρων. Αντίθετα, θα ήθελα να αποκτήσω αυτόματα τους τύπους δεδομένων που εμφανίζονται στο df.info() έξοδος στην εικόνα πάνω από, όπου υπήρχαν οι κατάλληλες στήλες αυτομάτως δίνεται ένας τύπος δεδομένων ημερομηνίας (πράσινα πλαίσια περιγράμματος). Δείτε πώς μπορείτε να το πετύχετε:

from dt_auto import read_csv
df=read_csv('myfile.csv')

Σημειώστε ότι το έκανα δεν καλέστε το pd.read_csv (την έκδοση Pandas του read_csv) παραπάνω απευθείας. Η συνάρτησή μου dt_auto.read_csv (δείτε τον κώδικά της παρακάτω) έχει ενεργοποιήσει την ίδια την pd.read_csv() και στη συνέχεια ανίχνευσε και μετατρέπει αυτόματα τον τύπο δεδομένων των δύο στηλών ημερομηνίας που εντοπίστηκαν. (Τα περιεχόμενα αυτού του df θα εμφανιστούν παρακάτω.)

Αν είχα χρησιμοποιήσει το κανονικό Pandas pd.read_csv(), θα είχα αποκτήσει απλώς γενικούς τύπους δεδομένων αντικειμένων από προεπιλογή όπως παρακάτω (κόκκινα πλαίσια περιγράμματος):

from pandas import read_csv
df=read_csv('myfile.csv')
df.info()



Σημειώστε ότι η μόνη διαφορά από τον αρχικό κωδικό είναι στη δήλωση εισαγωγής, όπου άλλαξα "από dt_auto" σε "από pandas". Αυτό αρκεί εφόσον χρησιμοποιείτε μόνο το "=read_csv()" σε όλη την έκταση, χωρίς να το χαρακτηρίζετε ως "=pd.read_csv()" ή "=dt_auto.read_csv()".

Εδώ είναι το περιεχόμενο του my dt_auto.py ("ημερομηνία αυτόματη"):

import pandas as pd
def dt_inplace(df): """Automatically detect and convert (in place!) each dataframe column of datatype 'object' to a datetime just when ALL of its non-NaN values can be successfully parsed by pd.to_datetime(). Also returns a ref. to df for convenient use in an expression. """ from pandas.errors import ParserError for c in df.columns[df.dtypes=='object']: #don't cnvt num try: df[c]=pd.to_datetime(df[c]) except (ParserError,ValueError): #Can't cnvrt some pass # ...so leave whole column as-is unconverted return df
def read_csv(*args, **kwargs): """Drop-in replacement for Pandas pd.read_csv. It invokes pd.read_csv() (passing its arguments) and then auto- matically detects and converts each column whose datatype is 'object' to a datetime just when ALL of the column's non-NaN values can be successfully parsed by pd.to_datetime(), and returns the resulting dataframe. """ return dt_inplace(pd.read_csv(*args, **kwargs))

Αλλά αυτό δεν είναι επικίνδυνο; Τι θα γινόταν αν μία από τις στήλες δεν ήταν εξ ολοκλήρου στήλη ημερομηνίας; Φυσικά, θα μπορούσατε να έχετε κάποιες ασαφείς συμβολοσειρές που τυχαίνει να μοιάζουν με ημερομηνίες, αλλά δεν είναι, αλλά δεν υπάρχει μεγάλος κίνδυνος αυτός ο κώδικας να μετατρέψει τυφλά ή να χάσει συμβολοσειρές που δεν είναι ημερομηνίας, για δύο λόγους:

  1. Αυτός ο κωδικός θα δεν μετατρέψτε οποιεσδήποτε τιμές σε μια στήλη εκτός εάν κάθε Η τιμή non-NaN σε αυτήν τη στήλη μπορεί να αναλυθεί επιτυχώς από το pd.to_datetime και να μετατραπεί σε timetime. Με άλλα λόγια, δεν θα το αφήσουμε ποτέ να μετατρέψει μια συμβολοσειρά σε pd.NaT (το αποτέλεσμα "αποτυχίας") επειδή δεν μπορεί να την κατανοήσει ως ώρα ημερομηνίας.
  2. Δεν θα δεν προσπαθήστε να μετατρέψετε στήλες που έχουν ήδη ερμηνευτεί ως οποιοσδήποτε άλλος τύπος εκτός από αντικείμενο, δηλαδή οποιοσδήποτε συγκεκριμένος τύπος όπως int64 ή float64, παρόλο που το pd.to_datetime θα είχε ευτυχώς (αλλά πιθανότατα ανεπιθύμητα) μετατρέψει έναν αριθμό όπως το 2000 στην ημερομηνία 2000-01 -01.

Από την εμπειρία μου μέχρι τώρα, η συνάρτηση dt_auto.read_csv δεν αργεί να εκτελεστεί σε ένα τυπικό πλαίσιο δεδομένων. Ακόμα κι αν υπάρχουν πολλές στήλες αντικειμένων (συμβολοσειρά) που δεν είναι ημερομηνία, σχεδόν πάντα πολύ γρήγορα συναντά μια τιμή κοντά στην κορυφή κάθε στήλης που δεν μπορεί να αναλύσει ως ημερομηνία ώρας και εγκαταλείπει και μεταβαίνει στην επόμενη στήλη χωρίς να επιχειρήσετε να αναλύσετε τις υπόλοιπες τιμές της στήλης.

Δείτε πώς φαίνεται το πλαίσιο δεδομένων που προκύπτει από το dt_auto.read_csv(), αν και δεν μπορείτε απαραίτητα να καταλάβετε κοιτάζοντας το ότι οι δύο κατάλληλες στήλες είναι όντως τύποι δεδομένων ημερομηνίας. Όπως συμβαίνει, το αρχείο CSV είχε έναν διαφορετικό αριθμό δεκαδικών ψηφίων (τρία, κανένα και εννέα) για τα δευτερόλεπτα στο Update_Timestamp, αλλά ο ίδιος ο τύπος δεδομένων ημερομηνίας εμφανίζει εννέα τέτοια ψηφία ανεξάρτητα. Η ημερομηνία γέννησης στο αρχείο csv είχε στην πραγματικότητα μόνο ημερομηνίες (χωρίς χρόνους) αλλά αποθηκεύτηκε ως πλήρης ημερομηνία, με μηδενικά για τις ώρες, τα λεπτά και τα δευτερόλεπτα (συμπεριλαμβανομένου του μηδενός ως δεκαδικού μέρους), αλλά όλα τα στοιχεία ώρας στη στήλη Το μηδέν κάνει τα Panda να εμφανίζουν μόνο την ημερομηνία (έτος-μήνας-ημέρα) για αυτήν τη στήλη.



Φυσικά το pd.to_datetime, και επομένως το dt_auto.read_csv, δεν μπορεί να χειριστεί όλες τις πιθανές μορφές ημερομηνίας και ημερομηνίας από προεπιλογή, αλλά θα χειριστεί πολλές κοινές σαφείς μορφές (γενικά έτος μήνα ημέρα) όπως αυτές που γράφτηκαν με τη μέθοδο dataframe.to_csv και πολλές άλλες εργαλεία, συμπεριλαμβανομένων πολλών μορφών ώρας ημερομηνίας ISO (οι οποίες έχουν γενικά ένα "T" που διαχωρίζει την ημερομηνία από την ώρα και όχι από ένα διάστημα). Δεν έχω πειραματιστεί με ημερομηνίες ημερομηνιών που περιλαμβάνουν πληροφορίες ζώνης ώρας, επειδή συνήθως δεν βλέπω τέτοια δεδομένα, αλλά ενημερώστε με σε ένα σχόλιο απάντησης εάν θα μπορούσαν να αντιμετωπιστούν καλύτερα με περαιτέρω αλλαγές στον κώδικα.

Τι νομίζετε; Βρήκατε αυτό το μικρό άρθρο χρήσιμο; Και πρέπει το ίδιο το Pandas να προσθέσει (π.χ. στην ίδια τη συνάρτηση pd.read_csv;) τη δυνατότητα να το κάνει προαιρετικά για εμάς, ώστε να μην χρειάζεται να αντιγράψετε/εισαγάγετε τον παραπάνω κώδικα dt_auto.py; Θα χαρώ να δω τα σχόλια και τις ερωτήσεις σας ως απαντήσεις εδώ.

 
Χάρη στον Elliot Gunn.

 
Bio: David B Rosen (PhD) είναι επικεφαλής επιστήμονας δεδομένων για την αυτοματοποιημένη έγκριση πιστώσεων στην IBM Global Financing. Βρείτε περισσότερα από τα γραπτά του David στο dabruro.medium.com.

Πρωτότυπο. Αναδημοσιεύτηκε με άδεια.

Συγγενεύων:



Κορυφαίες ιστορίες τις τελευταίες 30 ημέρες
Δημοφιλέστερα
  1. Διαβάζετε αρχεία Excel με Python; Υπάρχει 1000 φορές πιο γρήγορος τρόπος
  2. Οι επιστήμονες δεδομένων χωρίς δεξιότητες μηχανικής δεδομένων θα αντιμετωπίσουν τη σκληρή αλήθεια
  3. Ένα χαρτοφυλάκιο επιστήμης δεδομένων που θα σας προσφέρει τη δουλειά
  4. Αυτοματοποιήστε το Microsoft Excel και το Word χρησιμοποιώντας Python
  5. Πώς να δημιουργήσετε εκπληκτικές εφαρμογές Ιστού για τα έργα επιστήμης δεδομένων σας
Οι περισσότεροι Shared
  1. Τρόπος αντιμετώπισης μη ισορροπημένης ταξινόμησης, χωρίς επαναπροσδιορισμό των δεδομένων
  2. Πώς να βρείτε αδυναμίες στα μοντέλα μηχανικής εκμάθησης
  3. Το ανοιχτό βιβλίο της Συλλογής μηχανών και βαθιάς εκμάθησης
  4. Οι επιστήμονες δεδομένων χωρίς δεξιότητες μηχανικής δεδομένων θα αντιμετωπίσουν τη σκληρή αλήθεια
  5. Εξηγείται ο έλεγχος υποθέσεων

Πηγή: https://www.kdnuggets.com/2021/10/auto-detect-date-datetime-columns-and-set-their-datatype-when-reading-a-csv-file-in-pandas.html

Σφραγίδα ώρας:

Περισσότερα από KDnuggets