Kuidas Pandas CSV-faili lugemisel automaatselt tuvastada kuupäeva / kuupäeva ja kellaaja veerge ja määrata nende andmetüüp

Allikasõlm: 1106147

Kuidas Pandas CSV-faili lugemisel automaatselt tuvastada kuupäeva / kuupäeva ja kellaaja veerge ja määrata nende andmetüüp

Kui read_csv( ) loeb nt "2021-03-04" ja "2021-03-04 21:37:01.123" pelgalt "objekti" andmetüüpidena, saate sageli need kõik korraga automaatselt teisendada tõelisteks kuupäeva-aja andmetüüpideks.


By David B Rosen (PhD), IBM Global Financingu automatiseeritud krediidikinnituse juhtiv andmeteadlane



Oletame, et mul on CSV-andmefail, mida tahan Panda andmeraami sisse lugeda, ja mõned selle veerud on kuupäevad või kellaajad, kuid ma ei taha vaeva näha nende veergude nimede eelnevalt tuvastamisega/määramisega. Selle asemel sooviksin automaatselt hankida failis näidatud andmetüübid df.info() väljund pildil ülal, kus on olnud vastavad veerud automaatselt antud kuupäeva ja kellaaja andmetüüp (rohelised kontuurikastid). Seda saate teha järgmiselt.

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

Pange tähele, et ma tegin seda mitte kutsuge ülalt otse välja pd.read_csv (read_csv Pandase versioon). Minu funktsioon dt_auto.read_csv (vt selle koodi allpool) on ise käivitanud pd.read_csv() ning seejärel tuvastanud ja teisendanud automaatselt kahe tuvastatud kuupäeva-aja veeru andmetüübi. (Selle df-i sisu kuvatakse allpool.)

Kui ma oleksin kasutanud tavalist Panda pd.read_csv(), oleksin saanud vaikimisi ainult üldised objektide andmetüübid nagu allpool (punased kontuurikastid):

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



Pange tähele, et ainus erinevus algsest koodist on impordi avalduses, kus muutsin "from dt_auto" "from pandas". Sellest piisab seni, kuni kasutate läbivalt ainult "=read_csv()", mitte kvalifitseerida seda kui "=pd.read_csv()" või "=dt_auto.read_csv()".

Siin on minu sisu dt_auto.py (“automaatne kuupäev ja kellaaeg”):

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))

Aga kas see pole riskantne? Mis siis, kui üks veergudest ei oleks täielikult kuupäeva ja kellaaja veerg? Muidugi võib teil olla ebaselgeid stringe, mis näevad välja nagu kuupäevad, kuid ei ole seda, kuid ei ole suurt ohtu, et see kood pimesi teisendab või kaotab kuupäevaväliseid stringe kahel põhjusel:

  1. See kood teeb mitte teisendavad veerus olevad väärtused, välja arvatud juhul iga Selle veeru mitte-NaN-i väärtust saab edukalt sõeluda failiga pd.to_datetime ja teisendada datetime-iks. Teisisõnu, me ei lase tal kunagi teisendada stringi pd.NaT-ks (“tõrge” tulemus), kuna see ei mõista seda kuupäeva-kellaajana.
  2. See mitte proovige teisendada veerge, mida on juba tõlgendatud kui mis tahes muud tüüpi peale objekti, st mis tahes konkreetset tüüpi, nagu int64 või float64, kuigi pd.to_datetime oleks hea meelega (kuid tõenäoliselt ebasoovitavalt) teisendanud sellise arvu nagu 2000 kuupäevaks 2000-01 -01.

Minu senise kogemuse põhjal ei võta funktsiooni dt_auto.read_csv tüüpilises andmeraamis käitamine kaua aega. Isegi kui on palju mitte-kuupäeva-ajaobjekti (stringi) veerge, leiab see peaaegu alati väga kiiresti iga sellise veeru ülaosas väärtuse, mida ei saa sõeluda kuupäeva-kellaajana ning loobub ja liigub edasi järgmisse veergu. proovimata sõeluda ülejäänud veeru väärtusi.

Nii näeb välja dt_auto.read_csv() saadud andmeraam, kuigi te ei saa seda vaadates tingimata aru saada, et kaks sobivat veergu on tõepoolest kuupäeva ja ja kuupäeva andmetüübid. Nagu juhtub, oli CSV-failis Update_Timestamp sekundite jaoks erinev arv kümnendkohti (kolm, ükski ja üheksa), kuid andmetüüp datetime ise näitab üheksa sellist numbrit sellest hoolimata. CSV-faili sünnikuupäeval olid tegelikult ainult kuupäevad (aegadeta), kuid see salvestati täieliku kuupäeva ja kellaajana, kus tundide, minutite ja sekundite jaoks on nullid (sealhulgas null kümnendkohana), kuid kõik veerus olevad ajakomponendid kui null, kuvavad Pandad selle veeru jaoks ainult kuupäeva (aasta-kuu-päev).



Muidugi ei saa pd.to_datetime ja seega dt_auto.read_csv vaikimisi käsitleda kõiki võimalikke kuupäeva ja kuupäeva ja kellaaja vorminguid, kuid see käsitleb paljusid levinumaid ühemõttelisi (tavaliselt aasta kuu päev) vorminguid, nagu need, mis on kirjutatud meetodiga dataframe.to_csv ja palju muud. tööriistad, sealhulgas paljud ISO kuupäeva-aja vormingud (millel on tavaliselt T-täht, mis eraldab kuupäeva kellaajast, mitte tühikut). Ma ei ole katsetanud kuupäeva- ja kellaaegadega, mis sisaldavad ajavööndi teavet, kuna ma tavaliselt selliseid andmeid ei näe, kuid andke mulle vastuse kommentaaris teada, kas koodi edasiste muudatustega saaks neid paremini käsitleda.

Mida sa arvad? Kas see väike artikkel oli teile kasulik? Ja kas Pandas peaks ise lisama (nt funktsioonile pd.read_csv endale?) võimaluse seda meie eest valikuliselt teha, et te ei peaks minu ülaltoodud koodi dt_auto.py kopeerima/importima? Mul oleks hea meel näha teie kommentaare ja küsimusi siin vastustena.

 
Aitäh Elliot Gunnile.

 
Bio: David B Rosen (PhD) on IBM Global Financingu automatiseeritud krediidikinnituse juhtiv andmeuurija. Lisateavet Davidi kirjutistest leiate aadressilt dabruro.medium.com.

Originaal. Loaga uuesti postitatud.

Seotud:

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

Ajatempel:

Veel alates KDnuggets