क्या पांडा स्वचालित रूप से तिथियों को पहचान सकते हैं?


151

आज मैं इस तथ्य से सकारात्मक रूप से आश्चर्यचकित था कि डेटा फ़ाइल से डेटा पढ़ते समय (उदाहरण के लिए) पांडा मानों के प्रकारों को पहचानने में सक्षम है:

df = pandas.read_csv('test.dat', delimiter=r"\s+", names=['col1','col2','col3'])

उदाहरण के लिए इसे इस तरह से चेक किया जा सकता है:

for i, r in df.iterrows():
    print type(r['col1']), type(r['col2']), type(r['col3'])

विशेष रूप से पूर्णांक में, फ़्लोट्स और स्ट्रिंग्स को सही ढंग से पहचाना गया था। हालाँकि, मेरे पास एक कॉलम है जिसमें निम्न प्रारूप में तारीखें हैं 2013-6-4:। इन तारीखों को तार के रूप में पहचाना गया था (अजगर की तारीख-वस्तुओं के रूप में नहीं)। क्या मान्यता प्राप्त तिथियों को "सीखने" का एक तरीका है?


कृपया इस तरह के संस्करण-निर्भर प्रश्न के लिए, पंडों के संस्करण को हमेशा बताएं। में जुलाई 2013, इस v0.11 हो गया होता
एसएमसीआई

और dtypes प्रत्येक स्तंभ के लिए तय किए गए हैं, आपको df.iterrows()हर एक पंक्ति के लिए इसे देखने और उन्हें देखने की आवश्यकता नहीं है , बस df.info()एक बार करें।
6

जवाबों:


326

आपको जोड़ना चाहिए parse_dates=True, या parse_dates=['column name']जब पढ़ना चाहिए , तो आम तौर पर जादुई रूप से इसे पार्स करने के लिए पर्याप्त होता है। लेकिन हमेशा अजीब प्रारूप होते हैं जिन्हें मैन्युअल रूप से परिभाषित करने की आवश्यकता होती है। ऐसे मामले में आप एक दिनांक पार्सर फ़ंक्शन भी जोड़ सकते हैं, जो संभव सबसे लचीला तरीका है।

मान लें कि आपके पास अपनी स्ट्रिंग के साथ एक कॉलम 'डेटाइम' है, तो:

dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')

df = pd.read_csv(infile, parse_dates=['datetime'], date_parser=dateparse)

इस तरह आप कई कॉलमों को एक सिंगल डेटाइम कॉलम में भी मिला सकते हैं, यह 'डेट' और 'टाइम' कॉलम को एक सिंगल 'डेटाइम' कॉलम में मिला देता है:

dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')

df = pd.read_csv(infile, parse_dates={'datetime': ['date', 'time']}, date_parser=dateparse)

आप निर्देशों पा सकते हैं के लिए (यानी पत्र विभिन्न स्वरूपों के लिए प्रयोग की जाने वाली) strptimeऔर strftime इस पृष्ठ पर


8
मेरे लिए काम नहीं किया, मुझे निम्नलिखित त्रुटि मिली:TypeError: strptime() argument 1 must be str, not float
जीन पॉल

6
मुझे यह त्रुटि मिली क्योंकि मेरे डेटा फ़्रेम में नेन थे।
जीन पॉल

क्या आप ऐसा आइटम जोड़ सकते हैं जो गैर-पार्स करने योग्य सामग्री या NaN या / एनएस भी हो। क्योंकि ऐसा लगता है कि यह पार्सर पूरी तरह से पूरे स्तंभ को छोड़ देता है यदि ऐसा कुछ भी मौजूद है
अमीर

एक विकल्प है infer_datetime_format: "पांडा स्तंभों में डेटाइम स्ट्रिंग्स के प्रारूप का अनुमान लगाने का प्रयास करेंगे"। इसके स्थान पर इसका उपयोग किया जा सकता है date_parser
11

1
ध्यान दें कि यदि आपकी तारीखें ISO 8601प्रारूप में हैं, तो आपको पास infer_datetime_formatया पार्सर फ़ंक्शन नहीं करना चाहिए - यह पांडा को इसे (विशेष रूप से उत्तरार्द्ध) को संभालने देने की तुलना में बहुत धीमा है। इस उत्तर में
दिनांकरूप

20

शायद @ इंटरफ़ेस से उत्तर देने के बाद से पंडों का इंटरफ़ेस बदल गया है, लेकिन मैं जिस संस्करण (0.15.2) का उपयोग कर रहा हूं, date_parserफ़ंक्शन में एकल मान के बजाय तिथियों की एक सूची प्राप्त होती है। इस स्थिति में, उसका कोड इस तरह अपडेट किया जाना चाहिए:

dateparse = lambda dates: [pd.datetime.strptime(d, '%Y-%m-%d %H:%M:%S') for d in dates]

df = pd.read_csv(infile, parse_dates=['datetime'], date_parser=dateparse)

11

पंडों ने पढाई की तारीखों के लिए read_csv विधि बहुत बढ़िया है। Http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html पर पूरा प्रलेखन

आप अलग-अलग कॉलम में अलग-अलग तारीख के हिस्से भी रख सकते हैं और पैरामीटर पास कर सकते हैं:

parse_dates : boolean, list of ints or names, list of lists, or dict
If True -> try parsing the index. If [1, 2, 3] -> try parsing columns 1, 2, 3 each as a
separate date column. If [[1, 3]] -> combine columns 1 and 3 and parse as a single date
column. {‘foo : [1, 3]} -> parse columns 1, 3 as date and call result foo

तिथियों की डिफ़ॉल्ट सेंसिंग बहुत काम करती है, लेकिन यह उत्तर अमेरिकी तिथि प्रारूपों के लिए पक्षपाती लगती है। यदि आप कहीं और रहते हैं तो आप कभी-कभार परिणामों से पकड़े जा सकते हैं। जहाँ तक मैं याद कर सकता हूँ 1/6/2000 का अर्थ है 6 जनवरी अमरीका में 1 जून के विपरीत जहाँ मैं रहता हूँ। यदि 23/6/2000 जैसी तारीखों का उपयोग किया जाता है, तो यह चारों ओर स्विंग करने के लिए पर्याप्त स्मार्ट है। हालांकि तारीख की YYYYMMDD विविधताओं के साथ रहने के लिए सुरक्षित है। पांडा डेवलपर्स के लिए क्षमायाचना, यहां लेकिन मैंने हाल ही में स्थानीय तारीखों के साथ इसका परीक्षण नहीं किया है।

आप अपने स्वरूप को बदलने के लिए फ़ंक्शन पास करने के लिए date_parser पैरामीटर का उपयोग कर सकते हैं।

date_parser : function
Function to use for converting a sequence of string columns to an array of datetime
instances. The default uses dateutil.parser.parser to do the conversion.

2
आप dayfirstयूरोपीय / अंतर्राष्ट्रीय तिथियों के लिए ट्रू के रूप में निर्दिष्ट कर सकते हैं । pandas.pydata.org/pandas-docs/stable/generated/…
गॉर्डन

10

आप के pandas.to_datetime()लिए प्रलेखन में सिफारिश के रूप में उपयोग कर सकते हैं pandas.read_csv():

यदि किसी स्तंभ या अनुक्रमणिका में कोई अप्राप्य दिनांक है, तो संपूर्ण स्तंभ या अनुक्रमणिका को ऑब्जेक्ट डेटा प्रकार के रूप में अनलेप्ड किया जाएगा। गैर-मानक डेटाटाइम पार्सिंग के लिए, के pd.to_datetimeबाद का उपयोग करें pd.read_csv

डेमो:

>>> D = {'date': '2013-6-4'}
>>> df = pd.DataFrame(D, index=[0])
>>> df
       date
0  2013-6-4
>>> df.dtypes
date    object
dtype: object
>>> df['date'] = pd.to_datetime(df.date, format='%Y-%m-%d')
>>> df
        date
0 2013-06-04
>>> df.dtypes
date    datetime64[ns]
dtype: object

यह अन्य स्तंभों को भी आज तक परिवर्तित कर रहा है, जो वस्तु प्रकार के हैं
रत्नेश

10

दो स्तंभों को एक एकल डेटाइम कॉलम में विलय करते समय, स्वीकृत उत्तर एक त्रुटि (पांडा संस्करण 0.20.3) उत्पन्न करता है, क्योंकि कॉलम अलग से date_parser फ़ंक्शन को भेजे जाते हैं।

निम्नलिखित कार्य:

def dateparse(d,t):
    dt = d + " " + t
    return pd.datetime.strptime(dt, '%d/%m/%Y %H:%M:%S')

df = pd.read_csv(infile, parse_dates={'datetime': ['date', 'time']}, date_parser=dateparse)

1
मैं 0.22 पांडा का उपयोग कर रहा हूं और सहमत हूं कि स्वीकृत जवाब अब काम नहीं करता है।
दाई

यह मेरे लिए एक "टाइपर्रर: केवल कॉन्ट्रैनेट स्ट्रेट (" फ्लोट "नहीं) को स्ट्रेट बनाता है। दिनांक स्तंभ d / m / y है और समय स्तंभ H: M: 00
IceQueeny

8

हाँ - pandas.read_csv प्रलेखन के अनुसार :

नोट: iso8601-स्वरूपित दिनांक के लिए एक तेज़-पथ मौजूद है।

इसलिए यदि आपके सीएसवी में एक कॉलम है datetimeऔर तारीखें 2013-01-01T01:01उदाहरण के लिए दिखती हैं , तो इसे चलाने से पांडा बन जाएगा (मैं v0.19.2 पर हूं) स्वचालित रूप से तिथि और समय चुनें:

df = pd.read_csv('test.csv', parse_dates=['datetime'])

ध्यान दें कि आपको स्पष्ट रूप से पास करने की आवश्यकता है parse_dates, यह बिना काम नहीं करता है।

इसके साथ सत्यापित करें:

df.dtypes

आपको देखना चाहिए कि कॉलम का डेटाटाइप है datetime64[ns]


मुझे लगता है कि आप प्रश्न को गलत समझते हैं। उपयोगकर्ता उत्सुक है कि क्या विकल्प स्ट्रिंग के प्रारूप के लिए सक्षम किया जा सकता है।
आर्य मैकार्थी

@ आर्यमार्करी उम्म, वह मूल रूप से तारीख को सही तरीके से पहचानना चाहता है, इसलिए मैं उल्लेख कर रहा हूं कि वह स्रोत डेटा को कैसे बदल सकता है ताकि यह स्वाभाविक रूप से पांडा द्वारा पहचाना जाए। कहीं भी वह उल्लेख नहीं करता है कि वह स्रोत डेटा का प्रारूप नहीं बदल सकता है।
गौरव

1

यदि आपके लिए प्रदर्शन मायने रखता है तो सुनिश्चित करें कि आप समय:

import sys
import timeit
import pandas as pd

print('Python %s on %s' % (sys.version, sys.platform))
print('Pandas version %s' % pd.__version__)

repeat = 3
numbers = 100

def time(statement, _setup=None):
    print (min(
        timeit.Timer(statement, setup=_setup or setup).repeat(
            repeat, numbers)))

print("Format %m/%d/%y")
setup = """import pandas as pd
import io

data = io.StringIO('''\
ProductCode,Date
''' + '''\
x1,07/29/15
x2,07/29/15
x3,07/29/15
x4,07/30/15
x5,07/29/15
x6,07/29/15
x7,07/29/15
y7,08/05/15
x8,08/05/15
z3,08/05/15
''' * 100)"""

time('pd.read_csv(data); data.seek(0)')
time('pd.read_csv(data, parse_dates=["Date"]); data.seek(0)')
time('pd.read_csv(data, parse_dates=["Date"],'
     'infer_datetime_format=True); data.seek(0)')
time('pd.read_csv(data, parse_dates=["Date"],'
     'date_parser=lambda x: pd.datetime.strptime(x, "%m/%d/%y")); data.seek(0)')

print("Format %Y-%m-%d %H:%M:%S")
setup = """import pandas as pd
import io

data = io.StringIO('''\
ProductCode,Date
''' + '''\
x1,2016-10-15 00:00:43
x2,2016-10-15 00:00:56
x3,2016-10-15 00:00:56
x4,2016-10-15 00:00:12
x5,2016-10-15 00:00:34
x6,2016-10-15 00:00:55
x7,2016-10-15 00:00:06
y7,2016-10-15 00:00:01
x8,2016-10-15 00:00:00
z3,2016-10-15 00:00:02
''' * 1000)"""

time('pd.read_csv(data); data.seek(0)')
time('pd.read_csv(data, parse_dates=["Date"]); data.seek(0)')
time('pd.read_csv(data, parse_dates=["Date"],'
     'infer_datetime_format=True); data.seek(0)')
time('pd.read_csv(data, parse_dates=["Date"],'
     'date_parser=lambda x: pd.datetime.strptime(x, "%Y-%m-%d %H:%M:%S")); data.seek(0)')

प्रिंट:

Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 03:13:28) 
[Clang 6.0 (clang-600.0.57)] on darwin
Pandas version 0.23.4
Format %m/%d/%y
0.19123052499999993
8.20691274
8.143124389
1.2384357139999977
Format %Y-%m-%d %H:%M:%S
0.5238807110000039
0.9202787830000005
0.9832778819999959
12.002349824999996

तो iso8601- स्वरूपित तिथि के साथ ( %Y-%m-%d %H:%M:%Sजाहिरा तौर पर एक iso8601 स्वरूपित तिथि है, मुझे लगता है कि टी को गिराया जा सकता है और एक स्थान से बदल दिया जा सकता है) आपको निर्दिष्ट नहीं करना चाहिए infer_datetime_format(जो कि स्पष्ट रूप से अधिक सामान्य लोगों के साथ कोई फर्क नहीं पड़ता) और अपने स्वयं के पास कर रहा है सिर्फ अपंग प्रदर्शन में पार्सर। दूसरी ओर, date_parserइतने मानक दिन प्रारूपों के साथ कोई फर्क नहीं पड़ता है। हमेशा की तरह अनुकूलन करने से पहले समय सुनिश्चित करें।


1

Csv फ़ाइल लोड करते समय दिनांक स्तंभ शामिल होते हैं। हमारे पास तिथि स्तंभ को पहचानने के लिए पांडा बनाने के लिए दो दृष्टिकोण हैं

  1. पंडों ने स्पष्ट रूप से अर्ग द्वारा प्रारूप की पहचान की date_parser=mydateparser

  2. पंडों का कहना है कि कृषि द्वारा प्रारूप को मान्यता दी जाती है infer_datetime_format=True

डेट कॉलम डेटा में से कुछ

01/01/18

01/02/18

यहाँ हम पहली दो चीजों को नहीं जानते हैं यह महीना या दिन हो सकता है। तो इस मामले में हमें विधि 1 का उपयोग करना होगा: - प्रारूप को स्पष्ट करें

    mydateparser = lambda x: pd.datetime.strptime(x, "%m/%d/%y")
    df = pd.read_csv(file_name, parse_dates=['date_col_name'],
date_parser=mydateparser)

विधि 2: - लागू या स्वचालित रूप से स्वरूप को पहचानें

df = pd.read_csv(file_name, parse_dates=[date_col_name],infer_datetime_format=True)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.