پانڈوں میں CSV فائل کو پڑھتے وقت تاریخ/تاریخ کے وقت کے کالموں کا خود بخود پتہ لگانے اور ان کے ڈیٹا ٹائپ کو سیٹ کرنے کا طریقہ

ماخذ نوڈ: 1106147

پانڈوں میں CSV فائل کو پڑھتے وقت تاریخ/تاریخ کے وقت کے کالموں کا خود بخود پتہ لگانے اور ان کے ڈیٹا ٹائپ کو سیٹ کرنے کا طریقہ

جب read_csv( ) مثلاً "2021-03-04" اور "2021-03-04 21:37:01.123" کو محض "آبجیکٹ" ڈیٹا ٹائپس کے طور پر پڑھتا ہے، تو اکثر آپ ان سب کو ایک ساتھ خود بخود صحیح ڈیٹ ٹائم ڈیٹا ٹائپس میں تبدیل کر سکتے ہیں۔


By ڈیوڈ بی روزن (پی ایچ ڈی)IBM گلوبل فنانسنگ میں خودکار کریڈٹ کی منظوری کے لیے لیڈ ڈیٹا سائنٹسٹ



کہتے ہیں کہ میرے پاس ایک CSV ڈیٹا فائل ہے جسے میں پانڈاس ڈیٹا فریم میں پڑھنا چاہتا ہوں، اور اس کے کچھ کالم تاریخیں یا تاریخ کے اوقات ہیں، لیکن میں ان کالموں کے ناموں کی شناخت/تعین کرنے کی زحمت نہیں کرنا چاہتا۔ اس کے بجائے میں خود بخود میں دکھائے گئے ڈیٹا ٹائپس کو حاصل کرنا چاہوں گا۔ df.info() آؤٹ پٹ تصویر اوپر ، جہاں مناسب کالم رہے ہیں۔ خود کار طریقے سے ڈیٹ ٹائم ڈیٹا ٹائپ دیا گیا (سبز آؤٹ لائن بکس)۔ اسے پورا کرنے کا طریقہ یہاں ہے:

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

نوٹ کریں کہ میں نے کیا۔ نوٹ اوپر براہ راست pd.read_csv (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" سے "پانڈا سے" میں تبدیل کر دیا ہے۔ یہ اس وقت تک کافی ہے جب تک آپ صرف "=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 کے ذریعے پارس کیا جا سکتا ہے اور ڈیٹ ٹائم میں تبدیل کیا جا سکتا ہے۔ دوسرے لفظوں میں، ہم اسے کبھی بھی اسٹرنگ کو pd.NaT ("ناکامی" نتیجہ) میں تبدیل نہیں ہونے دیں گے کیونکہ یہ اسے ڈیٹ ٹائم کے طور پر نہیں سمجھ سکتا۔
  2. یہ ہو گا نوٹ کالموں کو تبدیل کرنے کی کوشش کریں جن کی پہلے ہی آبجیکٹ کے علاوہ کسی بھی قسم کی تشریح کی گئی ہو، یعنی کسی بھی مخصوص قسم جیسے int64 یا float64، اگرچہ pd.to_datetime نے خوشی سے (لیکن ناپسندیدہ طور پر) 2000 جیسے نمبر کو 2000-01 کی تاریخ میں تبدیل کر دیا ہو گا۔ -01.

میرے اب تک کے تجربے میں، dt_auto.read_csv فنکشن کو عام ڈیٹا فریم پر چلنے میں زیادہ وقت نہیں لگتا۔ یہاں تک کہ اگر بہت سارے نان ڈیٹ ٹائم آبجیکٹ (سٹرنگ) کالم موجود ہیں، تو یہ تقریباً ہمیشہ بہت جلد اس طرح کے ہر کالم کے اوپری حصے کے قریب ایک قدر کا سامنا کرتا ہے جسے یہ ڈیٹ ٹائم کے طور پر پارس نہیں کر سکتا اور چھوڑ دیتا ہے اور اگلے کالم پر چلا جاتا ہے۔ کالم کی باقی اقدار کو پارس کرنے کی کوشش کیے بغیر۔

dt_auto.read_csv() سے نتیجہ خیز ڈیٹا فریم کیسا دکھائی دیتا ہے، اگرچہ آپ اسے دیکھ کر یہ نہیں بتا سکتے کہ دو مناسب کالم درحقیقت ڈیٹ ٹائم ڈیٹا ٹائپس ہیں۔ جیسا کہ ایسا ہوتا ہے، CSV فائل میں Update_Timestamp میں سیکنڈوں کے لیے اعشاریہ مقامات کی مختلف تعداد (تین، کوئی نہیں، اور نو) تھی، لیکن ڈیٹ ٹائم ڈیٹا ٹائپ خود اس طرح کے نو ہندسے دکھاتا ہے۔ csv فائل میں تاریخ پیدائش میں درحقیقت صرف تاریخیں تھیں (کوئی وقت نہیں) لیکن اسے مکمل ڈیٹ ٹائم کے طور پر محفوظ کیا گیا تھا، گھنٹوں، منٹوں اور سیکنڈز کے لیے صفر کے ساتھ (بشمول اعشاریہ کے حصے کے طور پر صفر)، لیکن کالم میں وقت کے تمام اجزاء صفر ہونے کی وجہ سے پانڈاس اس کالم کے لیے صرف تاریخ (سال ماہ کا دن) ظاہر کرتے ہیں۔



یقینا pd.to_datetime، اور اس طرح dt_auto.read_csv، تمام ممکنہ تاریخ اور تاریخ وقت کے فارمیٹس کو بطور ڈیفالٹ ہینڈل نہیں کر سکتا، لیکن یہ بہت سے عام غیر مبہم (عام طور پر سال کے مہینے کے دن) فارمیٹس کو سنبھالے گا جیسے کہ dataframe.to_csv طریقہ سے لکھے گئے اور بہت سے دوسرے۔ ٹولز، بشمول بہت سے ISO ڈیٹ ٹائم فارمیٹس (جن میں عام طور پر "T" ہوتا ہے جو تاریخ کو جگہ کی بجائے وقت سے الگ کرتا ہے)۔ میں نے تاریخ کے اوقات کے ساتھ تجربہ نہیں کیا ہے جس میں ٹائم زون کی معلومات شامل ہیں کیونکہ میں عام طور پر اس طرح کا ڈیٹا نہیں دیکھتا ہوں، لیکن براہ کرم مجھے جوابی تبصرے میں بتائیں کہ آیا کوڈ میں مزید تبدیلیوں سے ان کو بہتر طریقے سے سنبھالا جا سکتا ہے۔

آپ کیا سوچتے ہیں؟ کیا آپ کو یہ چھوٹا سا مضمون مفید لگا؟ اور کیا پانڈوں کو خود (مثلاً pd.read_csv فنکشن میں؟) اختیاری طور پر ہمارے لیے ایسا کرنے کی صلاحیت شامل کرنی چاہیے تاکہ آپ کو اوپر میرے dt_auto.py کوڈ کو کاپی/ درآمد کرنے کی ضرورت نہ پڑے؟ مجھے آپ کے تبصرے اور سوالات یہاں جوابات کے طور پر دیکھ کر خوشی ہوگی۔

 
ایلیٹ گن کا شکریہ۔

 
بیو: ڈیوڈ بی روزن (پی ایچ ڈی) 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