পান্ডারা কি স্বয়ংক্রিয়ভাবে তারিখগুলি সনাক্ত করতে পারে?


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 হতো
smci

এবং প্রতিটি কলামের জন্য টাইপগুলি স্থির করা হয়েছে, আপনাকে পুনরাবৃত্তি করতে হবে df.iterrows()এবং প্রতি একক সারিতে এগুলি দেখার দরকার নেই , কেবল df.info()একবার করুন।
smci

উত্তর:


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
উইনান্দ

1
মনে রাখবেন যে আপনার তারিখগুলি ISO 8601বিন্যাসে থাকলে আপনার পাস করা উচিত নয় infer_datetime_formatবা কোনও পার্সার ফাংশন - এটি পান্ডাস হ্যান্ডেল দেওয়ার চেয়ে ধীর গতিতে (বিশেষত পরে) the এই উত্তরের তারিখের ফর্ম্যাটটিও এই বিভাগে চলে আসে
Mr_and_Mrs_D

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

পান্ডাস রিড_সিএসভি পদ্ধতি তারিখগুলি পার্স করার জন্য দুর্দান্ত। 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 এর মতো তারিখগুলি ব্যবহার করা হয় তবে এগুলি চারপাশে ঘুরিয়ে দেওয়ার পক্ষে যথেষ্ট স্মার্ট। তারিখের ওয়াইওয়াইওয়াইএমএমডিডি ভিন্নতার সাথে থাকতে সম্ভবত নিরাপদ। পান্ডাস বিকাশকারীদের কাছে ক্ষমাপ্রার্থী, তবে আমি সম্প্রতি স্থানীয় তারিখগুলির সাথে এটি পরীক্ষা করিনি।

আপনি আপনার ফর্ম্যাট রূপান্তর করতে কোনও ফাংশন পাস করার জন্য ডেট_পারসার প্যারামিটার ব্যবহার করতে পারেন।

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), যেহেতু কলামগুলি পৃথকভাবে তারিখ_পার্সার ফাংশনে প্রেরণ করা হয়।

নিম্নলিখিত কাজগুলি:

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 ব্যবহার করছি এবং স্বীকার করছি যে গৃহীত উত্তরটি আর কাজ করে না।
দাই

এটি আমার জন্য "টাইপএরআরআর তৈরি করে: কেবলমাত্র" ফ্ল্যাট "নয়" "সংযুক্ত করতে পারে। তারিখ কলামটি ডি / এম / ওয়াই এবং সময় কলামটি এইচ: এম: 00
আইসকিউয়েনি

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

সিএসভি ফাইল লোড করার সময় তারিখের কলাম থাকে date

  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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.