পান্ডাস রিড_সিএসভিতে তারিখের টাইম টাইপ


126

আমি একাধিক ডেটটাইম কলাম সহ সিএসভি ফাইলে পড়ছি। ফাইলটিতে পড়ার পরে আমার ডেটা ধরণের সেট করতে হবে তবে ডেটটাইমগুলি সমস্যা বলে মনে হচ্ছে। এই ক্ষেত্রে:

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

রান যখন ত্রুটি দেয়:

TypeError: ডেটা টাইপ "ডেটটাইম" বোঝা যায় নি

প্যান্ডাস.টো_ডেটটাইম () এর মাধ্যমে কলামগুলিকে বাস্তবের পরে রূপান্তর করা কোনও বিকল্প নয় যা আমি জানতে পারি না কোন কলামগুলি ডেটটাইম অবজেক্ট হবে। এই তথ্যটি পরিবর্তন করতে পারে এবং আমার টাইপ তালিকাকে যে কোনও তথ্য দেয় তা থেকে আসে।

বিকল্পভাবে, আমি csv ফাইলটি numpy.genfromtxt দিয়ে লোড করার চেষ্টা করেছি, সেই ফাংশনে dtyype সেট করে, এবং তারপরে একটি pandas.dataframe এ রূপান্তর করেছি তবে এটি ডেটা গারবেল করে। কোন সাহায্য ব্যাপকভাবে প্রশংসা করা হয়!

উত্তর:


272

কেন এটি কাজ করে না

রিড_সিএসভি-তে সেট করার জন্য কোনও ডেটটাইম টাইপ নেই কারণ সিএসভি ফাইলগুলিতে কেবল স্ট্রিং, পূর্ণসংখ্যা এবং ভাসমান থাকতে পারে।

ডেটটাইমটিতে ডাইপ টাইপ সেট করা পান্ডাসকে ডেটটাইমটিকে একটি অবজেক্ট হিসাবে ব্যাখ্যা করবে, যার অর্থ আপনি স্ট্রিং দিয়ে শেষ করবেন।

এটি সমাধানের পান্ডাস উপায়

pandas.read_csv()ফাংশন একটি শব্দ যুক্তি বলাparse_dates

এটি ব্যবহার করে আপনি ফ্লাইতে স্ট্রিং, ফ্লোট বা পূর্ণসংখ্যাকে ডিফল্ট date_parser( dateutil.parser.parser) ব্যবহার করে ডেটটাইমে রূপান্তর করতে পারেন can

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স্ট্রিং হিসাবে তৈরি করবে , যা তারা সম্ভবত ("২০১০-০5-০5" ইত্যাদি) এবং স্ট্রিং পড়ার পরে, প্রতিটি কলামের তারিখ_পার্সার সেই স্ট্রিংটিতে কাজ করবে এবং যে ফাংশনটি ফিরিয়ে দেবে তা ফিরিয়ে দেবে whatever ।

আপনার নিজস্ব তারিখ পার্সিং ফাংশন সংজ্ঞায়িত:

pandas.read_csv()ফাংশন এছাড়াও একটি শব্দ যুক্তি বলাdate_parser

এটি একটি ল্যাম্বদা ফাংশনে সেট করা সেই নির্দিষ্ট ফাংশনটি তারিখগুলি বিশ্লেষণের জন্য ব্যবহৃত হবে।

গোচা সতর্কতা

আপনাকে এটি ফাংশনটি দিতে হবে, ফাংশনটির সম্পাদন নয়, সুতরাং এটি সঠিক

date_parser = pd.datetools.to_datetime

এটি ভুল :

date_parser = pd.datetools.to_datetime()

পান্ডাস 0.22 আপডেট

pd.datetools.to_datetime স্থানান্তরিত করা হয়েছে date_parser = pd.to_datetime

ধন্যবাদ @ স্ট্যাকওভারওয়াইসি


1
@ ড্রেক আমি মনে করি ইউজার 3221055 সত্যই কখনই সাইটে ফিরে আসেনি। এটাই সমস্যা। প্রোফাইল বলেছে "সর্বশেষ 20 শে মে '14 এ 2:35 এ" প্রকাশিত হয়েছে
ফায়ার্লিনেক্স

2
এটি একটি ধীর সমাধান। : এই পরিবর্তে দেখুন stackoverflow.com/questions/29882573/...
user1761806

@ ব্যবহারকারী 1761806 আরে ভাল সন্ধান করুন! যদিও আমি আরও ভাল করেছিলাম। stackoverflow.com/a/46183514/3730397
firelynx

2
পান্ডাসে 0.22.0 এ অবহিত pandas.core.datetools.to_datetimeকরা হয়েছে, pd.datetools.to_datetimeপরিবর্তে ব্যবহার করুন। date_parser = pd.to_datetime
এটির

1
এখানে একটি convertersপ্যারামিটার রয়েছে যেখানে আপনি নির্দিষ্ট করতে পারবেন কোন কলামগুলিতে কোন রূপান্তরকারী রয়েছে। parse_dates সহায়ক এবং হ্যান্ডলগুলি খারাপ ডেটা কিন্তু এটি পরীক্ষা এবং প্রতিটি মান inferring ধীর কারণে 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

আমি টাইপগুলি = [তারিখের সময়, ...] বিকল্পটি ব্যবহার করার চেষ্টা করেছি, কিন্তু

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
এটি এখনও ফলাফলের ডেটাফ্রেমকে কোনও বস্তু হিসাবে তৈরি করবে, কোনও পান্ডাস.ডেটটাইম নয়
ফায়ারেলেক্স

11
এটির কাঙ্ক্ষিত প্রভাব না থাকলেও এটি কার্যকর হয় না:AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
গ্যাব্রিয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.