Hur man automatiskt identifierar datum-/datakolumnerna och ställer in deras datatyp när du läser en CSV-fil i Pandas

Källnod: 1106147

Hur man automatiskt identifierar datum-/datakolumnerna och ställer in deras datatyp när du läser en CSV-fil i Pandas

När read_csv () läser t.ex. "2021-03-04" och "2021-03-04 21: 37: 01.123" som bara "objekt" -datatyper kan du helt enkelt automatiskt konvertera dem alla samtidigt till sanna datatyper.


By David B Rosen (doktorand), Lead Data Scientist för automatiserat kreditgodkännande vid IBM Global Financing



Säg att jag har en CSV -datafil som jag vill läsa in i en Pandas dataram, och några av dess kolumner är datum eller datatider, men jag vill inte bry mig om att identifiera/specificera namnen på dessa kolumner i förväg. I stället vill jag automatiskt hämta datatyperna som visas i df.info() utgång på bilden ovan, där lämpliga kolumner har funnits automatiskt med en datetime -typ (gröna konturlådor). Så här uppnår du det:

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

Observera att jag gjorde det inte anropa pd.read_csv (Pandas -versionen av read_csv) ovan direkt. Min dt_auto.read_csv -funktion (se dess kod nedan) har anropat pd.read_csv () själv och sedan automatiskt upptäckt och konverterat datatypen för de två upptäckta datetime -kolumnerna. (Innehållet i denna df visas nedan.)

Om jag hade använt de vanliga Pandas pd.read_csv () hade jag som standard bara fått generiska objektdatatyper enligt nedan (röda konturrutor):

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



Observera att den enda skillnaden från den ursprungliga koden är i importmeddelandet, där jag ändrade "från dt_auto" till "från pandor". Detta är tillräckligt så länge du bara använder “= read_csv ()” hela tiden och inte kvalificerar det som “= pd.read_csv ()” eller “= dt_auto.read_csv ()”.

Här är innehållet i min dt_auto.py ("Automatiskt datetime"):

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

Men är inte detta riskabelt? Vad händer om en av kolumnerna inte helt var en datetime -kolumn? Naturligtvis kan du ha några oklara strängar som bara råkar se ut som datum men inte är det, men det finns inte stor risk att den här koden blindt kommer att konvertera eller förlora strängar utanför datetime, av två skäl:

  1. Denna kod kommer inte konvertera alla värden i en kolumn om inte varje icke-NaN-värde i den här kolumnen kan analyseras av pd.to_datetime och konverteras till en datetime. Med andra ord, vi kommer inte att låta den någonsin konvertera en sträng till en pd.NaT ("felet" -resultatet) eftersom den inte kan förstå den som en datetime.
  2. Det kommer inte försök att konvertera kolumner som redan har tolkats som någon annan typ än objekt, dvs någon specifik typ som int64 eller float64, även om pd.to_datetime gärna (men sannolikt oönskat) skulle ha konverterat ett tal som 2000 till datumet 2000-01 -01.

Enligt min erfarenhet har funktionen dt_auto.read_csv inte tagit lång tid att köra på en typisk dataram. Även om det finns många icke-datetime-objekt (sträng) -kolumner, stöter det nästan alltid mycket snabbt på ett värde nära toppen av varje sådan kolumn som den inte kan analysera som en datetime och ger upp och går vidare till nästa kolumn utan att försöka analysera resten av kolumnens värden.

Så här ser den resulterande dataframen ut från dt_auto.read_csv (), även om du inte nödvändigtvis kan se genom att titta på den att de två lämpliga kolumnerna verkligen är datatyper av tid. Som det händer hade CSV -filen ett varierande antal decimaler (tre, inga och nio) för sekunderna i Update_Timestamp, men datatypen själv visar nio sådana siffror oavsett. Födelsedatum i csv -filen hade faktiskt bara datum (inga tider) men lagrades som en fullständig datetime, med nollor för timmar, minuter och sekunder (inklusive noll som decimal), men alla tidskomponenter i kolumnen att vara noll gör att Pandor endast visar datum (år-månad-dag) för den här kolumnen.



Naturligtvis kan pd.to_datetime, och därmed dt_auto.read_csv, inte hantera alla möjliga datum- och datetime -format som standard, men det kommer att hantera många vanliga entydiga (vanligen år månad dag) format som de som skrivs av metoden dataframe.to_csv och många andra verktyg, inklusive många ISO -datatidsformat (som i allmänhet har ett ”T” som skiljer datumet från tiden snarare än ett mellanslag). Jag har inte experimenterat med datatider som innehåller information om tidszon eftersom jag vanligtvis inte ser sådan data, men meddela mig i en svarskommentar om dessa kunde hanteras bättre genom ytterligare ändringar av koden.

Vad tror du? Tyckte du att den här lilla artikeln var användbar? Och borde Pandas själv lägga till (t.ex. till pd.read_csv -funktionen själv?) Möjligheten att göra detta för oss så att du inte behöver kopiera/importera min dt_auto.py -kod ovan? Jag skulle gärna se dina kommentarer och frågor som svar här.

 
Tack till Elliot Gunn.

 
Bio: David B Rosen (doktorand) är Lead Data Scientist för Automated Credit Approval på IBM Global Financing. Hitta mer av Davids författarskap på dabruro.medium.com.

Ursprungliga. Skickas om med tillstånd.

Relaterat:

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

Tidsstämpel:

Mer från KDnuggets