כיצד לזהות אוטומטית את עמודות התאריך/תאריך ולהגדיר את סוג הנתונים שלהם בעת קריאת קובץ CSV בפנדות

צומת המקור: 1106147

כיצד לזהות אוטומטית את עמודות התאריך/תאריך ולהגדיר את סוג הנתונים שלהם בעת קריאת קובץ CSV בפנדות

כאשר read_csv( ) קורא למשל "2021-03-04" ו-"2021-03-04 21:37:01.123" כסוגי נתונים של "אובייקט", לעתים קרובות אתה יכול פשוט להמיר את כולם בבת אחת לסוגי נתונים אמיתיים של תאריך ושעה.


By דוד ב 'רוזן (דוקטורט), מדען נתונים מוביל לאישור אשראי אוטומטי במימון העולמי של IBM



נניח שיש לי קובץ נתונים 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() בעצמה ואז זיהתה והמירה אוטומטית את סוג הנתונים של שתי עמודות התאריך-שעה שזוהו. (התוכן של דף זה יוצג למטה).

אם הייתי משתמש ב-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()".

הנה התוכן שלי 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. הקוד הזה יהיה לֹא להמיר ערכים כלשהם בעמודה אלא אם כן כל ניתן לנתח בהצלחה ערך שאינו NaN בעמודה זו על ידי pd.to_datetime ולהמיר אותו ל-datetime. במילים אחרות, לא ניתן לו להמיר מחרוזת ל-pd.NaT (תוצאת ה"כשל") מכיוון שהוא לא יכול להבין את זה כתאריך-שעה.
  2. זה יהיה לֹא נסה להמיר עמודות שכבר פורשו כסוג כלשהו מלבד אובייקט, כלומר כל סוג ספציפי כמו int64 או float64, למרות ש-pd.to_datetime היה ממיר בשמחה (אך כנראה שלא רצוי) מספר כמו 2000 לתאריך 2000-01 -01.

מניסיוני עד כה, הפונקציה dt_auto.read_csv לא לוקחת הרבה זמן לרוץ על מסגרת נתונים טיפוסית. גם אם יש הרבה עמודות אובייקט (מחרוזת) שאינן תאריך-זמן, הוא כמעט תמיד נתקל במהירות רבה בערך בחלק העליון של כל עמודה כזו שהוא לא יכול לנתח כתאריך-שעה ומוותר ועובר לעמודה הבאה מבלי לנסות לנתח את שאר ערכי העמודה.

כך נראית מסגרת הנתונים שהתקבלה מ-dt_auto.read_csv(), אם כי אינך יכול בהכרח לדעת על ידי התבוננות בה ששתי העמודות המתאימות הן אכן סוגי נתונים של תאריך ושעה. כפי שזה קורה, לקובץ ה-CSV היה מספר משתנה של מקומות עשרוניים (שלושה, אף אחד ותשע) עבור השניות ב- Update_Timestamp, אבל סוג הנתונים של datetime עצמו מציג תשע ספרות כאלה ללא קשר. לתאריך הלידה בקובץ ה-csv היו למעשה רק תאריכים (ללא זמנים) אבל הוא נשמר כתאריך תאריך מלא, עם אפסים עבור השעות, הדקות והשניות (כולל אפס כחלק העשרוני), אך כל רכיבי הזמן בעמודה להיות אפס גורם לפנדות להציג רק את התאריך (שנה-חודש-יום) עבור העמודה הזו.



כמובן ש-pd.to_datetime, ולפיכך dt_auto.read_csv, לא יכול להתמודד עם כל הפורמטים האפשריים של תאריך ותאריך-שעה כברירת מחדל, אבל הוא יטפל בהרבה פורמטים חד-משמעיים נפוצים (בדרך כלל יום חודשי שנה) כמו אלה שנכתבו בשיטת dataframe.to_csv ועוד רבים אחרים כלים, כולל פורמטים רבים של ISO datetime (שבדרך כלל יש "T" המפריד בין התאריך לשעה ולא רווח). לא התנסיתי עם מועדי תאריכים הכוללים מידע על אזור זמן מכיוון שאני בדרך כלל לא רואה נתונים כאלה, אבל אנא הודע לי בהערת תגובה אם ניתן לטפל בהם טוב יותר על ידי שינויים נוספים בקוד.

מה אתה חושב? האם מצאתם את המאמר הקטן הזה שימושי? והאם Pandas עצמה צריכה להוסיף (למשל לפונקציה pd.read_csv עצמה?) את היכולת לעשות זאת עבורנו באופן אופציונלי כדי שלא תצטרך להעתיק/לייבא את קוד dt_auto.py שלי למעלה? אשמח לראות את ההערות והשאלות שלך כתגובות כאן.

 
תודה לאליוט גאן.

 
Bio you דוד ב 'רוזן (דוקטורט) הוא מדען נתונים מוביל לאישור אשראי אוטומטי במימון העולמי של IBM. מצא עוד את כתיבתו של דוד ב dabruro.medium.com.

מְקוֹרִי. פורסם מחדש באישור.

מידע נוסף:

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

בול זמן:

עוד מ KDnuggets