पंडों में CSV फ़ाइल पढ़ते समय दिनांक / दिनांक समय कॉलम का स्वतः पता कैसे लगाएं और उनका डेटाटाइप कैसे सेट करें

स्रोत नोड: 1106147

पंडों में CSV फ़ाइल पढ़ते समय दिनांक / दिनांक समय कॉलम का स्वतः पता कैसे लगाएं और उनका डेटाटाइप कैसे सेट करें

जब read_csv() उदाहरण के लिए "2021-03-04" और "2021-03-04 21:37:01.123" को केवल "ऑब्जेक्ट" डेटाटाइप के रूप में पढ़ता है, तो अक्सर आप उन सभी को एक ही बार में वास्तविक डेटाटाइम डेटाटाइप में स्वचालित रूप से परिवर्तित कर सकते हैं।


By डेविड बी रोसेन (पीएचडी), आईबीएम ग्लोबल फाइनेंसिंग में स्वचालित क्रेडिट अनुमोदन के लिए लीड डेटा वैज्ञानिक



मान लीजिए कि मेरे पास एक सीएसवी डेटा फ़ाइल है जिसे मैं पांडा डेटाफ़्रेम में पढ़ना चाहता हूं, और इसके कुछ कॉलम दिनांक या डेटाटाइम हैं, लेकिन मैं पहले से इन कॉलमों के नामों को पहचानने/निर्दिष्ट करने की जहमत नहीं उठाना चाहता। इसके बजाय मैं स्वचालित रूप से दिखाए गए डेटाटाइप प्राप्त करना चाहूंगा 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() को लागू किया है और फिर स्वचालित रूप से दो ज्ञात डेटाटाइम कॉलम के डेटाटाइप का पता लगाया और परिवर्तित किया है। (इस डीएफ की सामग्री नीचे दिखाई जाएगी।)

यदि मैंने नियमित पांडा 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 या फ्लोट64 जैसे किसी विशिष्ट प्रकार, भले ही pd.to_datetime ने खुशी से (लेकिन संभवतः अवांछनीय रूप से) 2000 जैसी संख्या को 2000-01 की तारीख में परिवर्तित कर दिया होगा -01.

मेरे अब तक के अनुभव में, dt_auto.read_csv फ़ंक्शन को सामान्य डेटाफ़्रेम पर चलने में अधिक समय नहीं लगता है। भले ही बहुत सारे गैर-डेटाटाइम ऑब्जेक्ट (स्ट्रिंग) कॉलम हों, यह लगभग हमेशा ऐसे प्रत्येक कॉलम के शीर्ष के पास बहुत जल्दी एक मान का सामना करता है जिसे यह डेटाटाइम के रूप में पार्स नहीं कर सकता है और छोड़ देता है और अगले कॉलम पर चला जाता है कॉलम के बाकी मानों को पार्स करने का प्रयास किए बिना।

परिणामी डेटाफ़्रेम dt_auto.read_csv() से इस तरह दिखता है, हालाँकि आप इसे देखकर यह नहीं बता सकते कि दो उपयुक्त कॉलम वास्तव में डेटाटाइम डेटाटाइप हैं। जैसा कि होता है, सीएसवी फ़ाइल में अपडेट_टाइमस्टैम्प में सेकंड के लिए अलग-अलग दशमलव स्थानों (तीन, कोई नहीं, और नौ) की संख्या होती है, लेकिन डेटाटाइम डेटाटाइप स्वयं ऐसे नौ अंक दिखाता है। सीएसवी फ़ाइल में जन्मतिथि में वास्तव में केवल तारीखें थीं (कोई समय नहीं) लेकिन इसे पूर्ण डेटाटाइम के रूप में संग्रहीत किया गया था, घंटों, मिनटों और सेकंड के लिए शून्य (दशमलव भाग के रूप में शून्य सहित), लेकिन कॉलम में सभी समय घटक थे शून्य होने के कारण पांडा इस कॉलम के लिए केवल तारीख (वर्ष-महीना-दिन) प्रदर्शित करते हैं।



बेशक pd.to_datetime, और इस प्रकार dt_auto.read_csv, डिफ़ॉल्ट रूप से सभी संभावित दिनांक और डेटाटाइम प्रारूपों को संभाल नहीं सकता है, लेकिन यह कई सामान्य असंदिग्ध (आम तौर पर साल महीने दिन) प्रारूपों को संभाल लेगा जैसे कि dataframe.to_csv विधि द्वारा लिखे गए और कई अन्य उपकरण, जिसमें कई आईएसओ डेटाटाइम प्रारूप शामिल हैं (जिनमें आम तौर पर एक स्थान के बजाय दिनांक को समय से अलग करने वाला "टी" होता है)। मैंने डेटाटाइम के साथ प्रयोग नहीं किया है जिसमें टाइमज़ोन जानकारी शामिल है क्योंकि मैं आमतौर पर उस तरह का डेटा नहीं देखता हूं, लेकिन कृपया मुझे एक प्रतिक्रिया टिप्पणी में बताएं कि क्या कोड में और बदलावों से इन्हें बेहतर ढंग से संभाला जा सकता है।

आप क्या सोचते हैं? क्या आपको यह छोटा सा लेख उपयोगी लगा? और क्या पंडों को हमारे लिए वैकल्पिक रूप से ऐसा करने की क्षमता स्वयं जोड़नी चाहिए (उदाहरण के लिए pd.read_csv फ़ंक्शन में?) ताकि आपको उपरोक्त मेरे dt_auto.py कोड को कॉपी/आयात करने की आवश्यकता न हो? मुझे आपकी टिप्पणियों और प्रश्नों को यहां प्रतिक्रियाओं के रूप में देखकर खुशी होगी।

 
इलियट गुन को धन्यवाद।

 
जैव: डेविड बी रोसेन (पीएचडी) आईबीएम ग्लोबल फाइनेंसिंग में स्वचालित क्रेडिट अनुमोदन के लिए प्रमुख डेटा वैज्ञानिक हैं। डेविड के लेखन के बारे में और अधिक जानकारी यहां पाएं डाबरू.मीडियम.कॉम.

मूल। अनुमति के साथ पुनर्प्रकाशित।

संबंधित:



शीर्ष आलेख पिछले 30 दिन
सबसे लोकप्रिय
  1. क्या आप पायथन के साथ एक्सेल फाइलें पढ़ते हैं? एक 1000x तेज़ तरीका है
  2. डेटा इंजीनियरिंग कौशल के बिना डेटा वैज्ञानिकों को कठोर सच्चाई का सामना करना पड़ेगा
  3. एक डेटा विज्ञान पोर्टफोलियो जो आपको नौकरी देगा
  4. Python का उपयोग करके Microsoft Excel और Word को स्वचालित करें
  5. अपने डेटा विज्ञान परियोजनाओं के लिए आश्चर्यजनक वेब ऐप्स कैसे बनाएं
सर्वाधिक साझा
  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

समय टिकट:

से अधिक केडनगेट्स

शीर्ष कहानियां, 6-12 सितंबर: क्या आप पायथन के साथ एक्सेल फाइलें पढ़ते हैं? एक 1000x तेज़ तरीका है; शुरुआती के लिए 8 डीप लर्निंग प्रोजेक्ट आइडियाज

स्रोत नोड: 1866658
समय टिकट: सितम्बर 13, 2021