पंडों में डेटाटाइम dtypes read_csv


126

मैं कई डेटाटाइम कॉलम के साथ एक सीएसवी फ़ाइल में पढ़ रहा हूं। मुझे फ़ाइल में पढ़ने पर डेटा प्रकार सेट करने की आवश्यकता होगी, लेकिन डेटाटम्स एक समस्या प्रतीत होती है। उदाहरण के लिए:

headers = ['col1', 'col2', 'col3', 'col4']
dtypes = ['datetime', 'datetime', 'str', 'float']
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

जब रन एक त्रुटि देता है:

TypeError: डेटा प्रकार "डेटाटाइम" समझ में नहीं आया

इस तथ्य के बाद स्तंभों को परिवर्तित करना, pandas.to_datetime () के माध्यम से एक विकल्प नहीं है जो मुझे पता नहीं हो सकता है कि कौन से कॉलम वैवाहिक जीवन ऑब्जेक्ट होंगे। वह जानकारी बदल सकती है और जो भी मेरी dtypes सूची को सूचित करता है, उससे आता है।

वैकल्पिक रूप से, मैंने csv फ़ाइल को numpy.genfromtxt के साथ लोड करने का प्रयास किया है, उस फ़ंक्शन में dtypes सेट करें, और फिर एक pandas.dataframe में कनवर्ट करें लेकिन यह डेटा को गार्बेज करता है। कोई भी मदद बहुत ही सराहनीय होगी!

जवाबों:


272

यह काम क्यों नहीं करता है

Read_csv के लिए सेट करने के लिए कोई डेटाटाइम नहीं है क्योंकि csv फ़ाइलों में केवल स्ट्रिंग्स, पूर्णांक और फ़्लोट्स हो सकते हैं।

डेटाइम को डेटाटाइम पर सेट करने से पांडा को ऑब्जेक्टटाइम को ऑब्जेक्ट के रूप में समझा जाएगा, जिसका अर्थ है कि आप एक स्ट्रिंग के साथ समाप्त हो जाएंगे।

इसे सुलझाने का पंडाल तरीका

pandas.read_csv()समारोह एक कीवर्ड तर्क कहा जाता हैparse_dates

इसका उपयोग कर आप डिफ़ॉल्ट date_parser( dateutil.parser.parser) का उपयोग करके मक्खी को स्ट्रिंग्स, फ़्लोट या पूर्णांकों को डेटासेटाइम में बदल सकते हैं।

headers = ['col1', 'col2', 'col3', 'col4']
dtypes = {'col1': 'str', 'col2': 'str', 'col3': 'str', 'col4': 'float'}
parse_dates = ['col1', 'col2']
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes, parse_dates=parse_dates)

इससे पंडों को पढ़ना होगा col1औरcol2 स्ट्रिंग के रूप में देगा, जो कि वे सबसे अधिक संभावना रखते हैं ("2016-05-05" आदि) और स्ट्रिंग को पढ़ने के बाद, प्रत्येक कॉलम के लिए date_parser उस स्ट्रिंग पर कार्य करेगा और उस फ़ंक्शन को जो भी वापस लौटाएगा ।

अपनी खुद की तारीख पार्सिंग फ़ंक्शन को परिभाषित करना:

pandas.read_csv()समारोह भी एक कीवर्ड तर्क कहा जाता हैdate_parser

इसे एक लंबो फ़ंक्शन में सेट करने से तारीखों के पार्सिंग के लिए उस विशेष फ़ंक्शन का उपयोग किया जाएगा।

GOTCHA चेतावनी

आपको इसे फ़ंक्शन देना है, फ़ंक्शन का निष्पादन नहीं है, इस प्रकार यह सही है

date_parser = pd.datetools.to_datetime

यह गलत है :

date_parser = pd.datetools.to_datetime()

पंडों 0.22 अद्यतन

pd.datetools.to_datetime को स्थानांतरित कर दिया गया है date_parser = pd.to_datetime

धन्यवाद @stackoverYC


1
@Drake मुझे लगता है कि user3221055 कभी भी वास्तव में साइट पर वापस नहीं आया। यही समस्या है। प्रोफ़ाइल कहती है "अंतिम बार 20 मई 14 को 2:35 बजे"
फायरलैक्स

2
यह एक धीमा उपाय है। इसके बजाय इसे देखें: stackoverflow.com/questions/29882573/…
user1761806

@ user1761806 अरे अच्छा खोजो! मैंने हालांकि एक बेहतर बनाया। stackoverflow.com/a/46183514/3730397
जुलाब

2
पांडा पर 0.22.0 कहते हैं pandas.core.datetools.to_datetimeकि पदावनत किया गया है, pd.datetools.to_datetimeइसके बजाय उपयोग करें । इस तरह:date_parser = pd.to_datetime
stackoverYC

1
एक convertersपैरामीटर भी है जहां आप निर्दिष्ट कर सकते हैं कि कौन से कॉलम में कौन से कन्वर्टर्स हैं। parse_dates सहायक है और खराब डेटा को संभालता है, लेकिन यह परीक्षण और प्रत्येक मान gist.github.com/gjreda/7433f5f70299610d9b6b पर
दावोस

31

एक parse_datesपैरामीटर है read_csvजिसके लिए आप उन स्तंभों के नाम परिभाषित कर सकते हैं, जिन्हें आप दिनांक या डेटासेट के रूप में मानते हैं:

date_cols = ['col1', 'col2']
pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=date_cols)

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

15

आप स्ट्रिंग्स के बजाय वास्तविक प्रकारों को पारित करने का प्रयास कर सकते हैं।

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime, datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

लेकिन यह आपके डेटा के बिना टिंकर के साथ इसका निदान करना वास्तव में कठिन होने जा रहा है।

और वास्तव में, आप शायद पांडा को टाइमस्टैम्प में तारीखों को पार्स करना चाहते हैं, ताकि यह हो सके:

pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=True)

7

मैंने dtypes = [डेटाइम, ...] विकल्प का उपयोग करने की कोशिश की, लेकिन

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime, datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

मुझे निम्नलिखित त्रुटि का सामना करना पड़ा:

TypeError: data type not understood

एकमात्र बदलाव जो मुझे करना था, वह है डेटाइम को डेटाइमटाइमटाइमटाइम से बदलना

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime.datetime, datetime.datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

3
यह अभी भी परिणामी डेटाफ्रेम की वस्तु को एक पंडित बना देगा, न कि एक pandas.datetime
Firelynx

11
इस तथ्य के अलावा कि इसका वांछित प्रभाव नहीं है, यह भी काम नहीं करता है:AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
गेब्रियल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.