পান্ডে ডেটটাইম ফর্ম্যাট কীভাবে পরিবর্তন করবেন


118

আমার ডেটাফ্রেমের একটি DOBকলাম রয়েছে (উদাহরণ ফর্ম্যাট 1/1/2016) যা ডিফল্টরূপে পান্ডাস dtype 'অবজেক্টে রূপান্তরিত হয়:DOB object

সঙ্গে তারিখ বিন্যাস এই রূপান্তর df['DOB'] = pd.to_datetime(df['DOB']), তারিখ রূপান্তরিত পরার: 2016-01-26এবং তার dtypeহল: DOB datetime64[ns]

এখন আমি এই তারিখের ফর্ম্যাটটি 01/26/2016বা অন্য কোনও সাধারণ তারিখের ফর্ম্যাটে রূপান্তর করতে চাই । আমি এটা কিভাবে করব?

আমি যে পদ্ধতিতে চেষ্টা করি না কেন, এটি সর্বদা 2016-01-26ফরম্যাটে তারিখটি দেখায় ।


আপনি কি এমন কোনও সমাধান খুঁজছেন যা কেবলমাত্র জুপিটার নোটবুকের আওতায় কাজ করে? (কোন ক্ষেত্রে প্রতি কলামে 'স্টাইলার' ব্যবহার করুন) বা সরল পাইথন কনসোল এবং আইপাইথনে কাজ করে?
স্মি

উত্তর:


230

আপনি dt.strftimeযদি datetimeঅন্য ফর্ম্যাটগুলিতে রূপান্তর করতে চান তবে আপনি ব্যবহার করতে পারেন (তবে নোট করুন যে dtypeকলামটি এর পরে হবে object( string)):

import pandas as pd

df = pd.DataFrame({'DOB': {0: '26/1/2016', 1: '26/1/2016'}})
print (df)
         DOB
0  26/1/2016 
1  26/1/2016

df['DOB'] = pd.to_datetime(df.DOB)
print (df)
         DOB
0 2016-01-26
1 2016-01-26

df['DOB1'] = df['DOB'].dt.strftime('%m/%d/%Y')
print (df)
         DOB        DOB1
0 2016-01-26  01/26/2016
1 2016-01-26  01/26/2016

34
'স্ট্রফটাইম' ডিওবি 1-এ অপারেশন প্রয়োগের জন্য ডেটটাইম কলামটিকে ইউনিকোডে রূপান্তর করে আমাদের আবারও ডেটটাইমে রূপান্তর করতে হবে। ডেটা টাইপ না করে বিন্যাসের কোনও উপায় নেই?
এম জামান

4
@ জেজরেল, এর চেয়ে ভাল কোনও সমাধান আছে যা ডেটাটাইপও ধরে রাখে এবং তারিখগুলি কোনও বস্তুর কলামে ফিরিয়ে দেয় না? সমস্যাটি হ'ল সমাধানে প্রস্তাবিত হিসাবে 'ডিএফ [' ডিওবি 1 '] = ডিএফ [' ডিওবি ']। ডিটি.স্ট্রিফটাইম ('% এম /% ডি /% ওয়াই ')' এর পরে যদি এটিকে রূপান্তর করার চেষ্টা করা হয় তবে তারপরে তারিখগুলি তাদের মূল ফর্ম্যাটে ফিরে আসে।
আউটকাস্ট

হাহাহা, সুতরাং আমি যদি এটি ব্যবহার করতে চাই তবে আমি কীভাবে এটি করতে পারি তবে .mergeঅন্য একটি ডেটাফ্রেমের ডেটটাইম কলামে এই কলামটি ব্যবহার করতে চাই ? এটি করতে অন্য ডেটটাইম কলামটি কোনও অবজেক্ট কলামে রূপান্তর করার কোনও অর্থ নেই .merge?
আউটকাস্ট

হ্যাঁ স্পষ্টতই আমি সম্মত তবে "অস্তিত্ব নেই :(" দ্বারা আপনি বলেছিলেন যে আমি কলামটি নতুন বিন্যাসটি না হারিয়ে ফর্ম্যাটটি পরিবর্তন করার পরে ডেটটাইমে রূপান্তর করতে পারব না। সুতরাং?
আউটসেট

ঠিক আছে, যতদূর আমি বুঝতে পেরেছি, .mergeউভয় কলামগুলি ডেটটাইম কলামগুলি হলেও একই ধরণের বিন্যাস না থাকলে এখনও সঠিকভাবে করা যায়। এটা কী ঠিক?
ওদেরকে বিতাড়নের

23

ফর্ম্যাট পরিবর্তন করা হচ্ছে তবে প্রকারটি পরিবর্তন করা হচ্ছে না:

df['date'] = pd.to_datetime(df["date"].dt.strftime('%Y-%m'))

শুধু মনে রাখবেন যে ডিএফ ["তারিখ"] আপনার এটি করার আগে
ডেটটাইম 64

4
না! ধরুন dateকলামে কিছু আইটেমের মূল মান হ'ল " 26 নভেম্বর , 2019"। strftime()মানে "সময় থেকে স্ট্রিং" , সুতরাং সেই আইটেমটির জন্য স্ট্রিংdf["date"].dt.strftime('%Y-%m') হবে । তারপর, এই স্ট্রিং রূপান্তর করবে ফিরে যাও হিসাবে "নভেম্বর এখন ফরম্যাট, কিন্তু 1 , 2019"! সুতরাং ফলাফলটি হবে: কোনও বিন্যাসে পরিবর্তন হয় না, তবে তারিখের মানটিই পরিবর্তন হয়! "2019-11"pd.to_datetime()datetime64
মেরিয়ানড

4
@ মারিয়ানাডি: পৃথক উত্তরের উপর আপনার সমস্ত মন্তব্য দরকারী তবে আপনি কি দয়া করে আপনার উত্তরের নীচে "পিটফলস / এগুলি করবেন না" এর একটি রোলআপে সংক্ষিপ্ত বিবরণ দিতে পারেন? এছাড়াও এগুলির প্রতিটিটির ক্ষেত্রে সমস্যাটি কী তা স্পষ্ট করে আপনাকে জানাতে হবে: যদি ইনপুট তারিখগুলির কোনও প্রত্যাশিত বিন্যাসে না থাকে তবে এগুলি ব্যতিক্রম ছুঁড়ে ফেলার ঝুঁকি বা তারিখের ম্যাঙ্গাল তৈরি করে। সহজভাবে "না!" সর্বত্র তা প্রকাশ করে না।
স্মি

8

আগের কোডটির পরিবর্তে নীচের কোডটি আমার জন্য কাজ করেছিল - এটি ব্যবহার করে দেখুন!

df['DOB']=pd.to_datetime(df['DOB'].astype(str), format='%m/%d/%Y')

4
না! আপনার format='%m/%d/%Y'প্যারামিটারটি একটি স্ট্রিং পার্স করার জন্য , অর্থাত্ আপনাকে যেমন একটি বিন্যাসে স্ট্রিং সরবরাহ করার কথা (যেমন "5/13/2019")। আর কিছুই নয়, বিন্যাসের কোনও পরিবর্তন নেই। এটি এখনও হিসাবে প্রদর্শিত হবে 2019-05-13- বা এটি একটি ব্যতিক্রম উত্থাপন করবে, যদি df['DOB'].astype(str)আইটেম (গুলি) থাকে যেমন এমন বিন্যাসে নয়, যেমন একটি বিন্যাসে "2019-05-13"
মেরিয়ানড

5

প্রথম উত্তরের তুলনায়, আমি প্রথমে dt.strftime () ব্যবহার করার পরামর্শ দেব, তারপরে পিডি টু_ডেটটাইম ()। এইভাবে, এটি এখনও ডেটটাইম ডেটা টাইপের ফলাফল করবে।

উদাহরণ স্বরূপ,

import pandas as pd

df = pd.DataFrame({'DOB': {0: '26/1/2016 ', 1: '26/1/2016 '})
print(df.dtypes)

df['DOB1'] = df['DOB'].dt.strftime('%m/%d/%Y')
print(df.dtypes)

df['DOB1'] = pd.to_datetime(df['DOB1'])
print(df.dtypes)

4
এটি আমার ক্ষেত্রে অন্তত কাজ করে না। বিশেষত, কলামটি ডেটটাইম ডেটা টাইপে রূপান্তরিত হয় তবে মানগুলিও মূল বিন্যাসে রূপান্তরিত হয়!
21:59

না! সিন্ডাক্স ত্রুটি (নিখোঁজ ব্রেস), আমার পান্ডসের সংস্করণে (0.25.1) অন্য একটি সিনট্যাক্স ত্রুটি (dt.strfime () - কেবল ডেটটাইম লাইক সহ ডেট অ্যাক্সেসর ব্যবহার করতে পারে) - আপনি সহজাত ডেটা টাইপের উপর নির্ভর করেন তবে বিভিন্ন সংস্করণে অন্তর্নিহিত ডেটা টাইপ পান্ডস পৃথক হতে পারে), এবং একটি অদ্ভুত যুক্তি - কেন ডেটটাইমকে স্ট্রিংয়ে রূপান্তর করতে হবে এবং তারপরে ডেটটাইমে ফিরে যেতে হবে কেন? Commentষি জইনের উত্তর সম্পর্কে আমার মন্তব্য দেখুন।
মেরিয়ানড

3

মধ্যে পার্থক্য আছে

  • বিষয়বস্তু একটি dataframe কক্ষের (ক বাইনারি মান) এবং
  • এটি আমাদের উপস্থাপনা (এটি প্রদর্শিত হচ্ছে) মানবদের জন্য।

সুতরাং প্রশ্নটি হল: নিজের ডেটা / ডেটা টাইপগুলি পরিবর্তন না করে আমার ডেটাসের যথাযথ উপস্থাপনাটি কীভাবে পৌঁছাবেন ?

উত্তরটি এখানে:

  • আপনি যদি নিজের ডেটাফ্রেম প্রদর্শনের জন্য জুপিটার নোটবুক ব্যবহার করেন , বা
  • আপনি যদি এইচটিএমএল ফাইল আকারে উপস্থাপনায় পৌঁছতে চান (এমনকি আরও কিছু সিএসএস স্টাইলিংয়ের জন্য অতিরিক্ত প্রস্তুত অতিরিক্ত অতিরিক্ত idএবং classগুণাবলী সহ - আপনি সেগুলি ব্যবহার নাও করতে পারেন),

স্টাইলিং ব্যবহার করুন । স্টাইলিং আপনার ডেটাফ্রেমের কলামগুলির ডেটা / ডেটা পরিবর্তন করে না।

এখন আমি আপনাকে জুপিটার নোটবুকে এটি কীভাবে পৌঁছানোর তা দেখিয়েছি - এইচটিএমএল ফাইল আকারে উপস্থাপনার জন্য প্রশ্নের শেষে নোটটি দেখুন।

আমি অনুমান করব যে আপনার কলামে DOB ইতিমধ্যে প্রকারটি রয়েছেdatetime64 (আপনি দেখিয়েছেন যে কীভাবে এটি পৌঁছতে হবে)। আপনাকে কিছু প্রাথমিক স্টাইলিং দেখানোর জন্য আমি একটি সাধারণ ডেটাফ্রেম (কেবল একটি কলাম সহ) প্রস্তুত করেছি:

  • স্টাইলযুক্ত নয়:

       df
    
          DOB
0  2019-07-03
1  2019-08-03
2  2019-09-03
3  2019-10-03
  • এটি স্টাইলিং হিসাবে mm/dd/yyyy:

       df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")})
    
          DOB
0  07/03/2019
1  08/03/2019
2  09/03/2019
3  10/03/2019
  • এটি স্টাইলিং হিসাবে dd-mm-yyyy:

       df.style.format({"DOB": lambda t: t.strftime("%d-%m-%Y")}) 
    
          DOB
0  03-07-2019
1  03-08-2019
2  03-09-2019
3  03-10-2019

সাবধান হও!
রিটার্নিং অবজেক্ট কোনও ডেটাফ্রেম নয় - এটি ক্লাসের একটি অবজেক্ট Styler, তাই এটিকে আবার বরাদ্দ করবেন না df:

এটি করবেন না:

df = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")})    # Don´t do this!

(প্রতিটি ডেটাফ্রেমের নিজস্ব স্টাইলার অবজেক্ট তার .styleসম্পত্তি দ্বারা অ্যাক্সেসযোগ্য থাকে এবং আমরা এই df.styleঅবজেক্টটি পরিবর্তন করেছিলাম, ডেটাফ্রেম নিজেই নয়))


প্রশ্ন এবং উত্তর:

  • প্রশ্ন: কেন আপনার স্টাইলার অবজেক্ট (বা এটি প্রকাশের কোনও অভিব্যক্তি) জুপিটার নোটবুক সেলটিতে সর্বশেষ কমান্ড হিসাবে ব্যবহৃত আপনার (স্টাইলযুক্ত) টেবিলটি প্রদর্শন করে , এবং স্টাইলার অবজেক্টটি নিজেই প্রদর্শন করে না?

  • উত্তর: কারণ প্রতিটি স্টাইলার অবজেক্টের একটি কলব্যাক পদ্ধতি রয়েছে ._repr_html_()যা আপনার ডেটাফ্রেম (একটি সুন্দর এইচটিএমএল টেবিল হিসাবে) উপস্থাপনের জন্য একটি এইচটিএমএল কোড দেয়।

    জুপিটার নোটবুক আইডিই এই পদ্ধতিটিতে এটি থাকা বস্তুগুলি রেন্ডার করতে স্বয়ংক্রিয়ভাবে কল করে।


বিঃদ্রঃ:

স্টাইলিংয়ের জন্য আপনার জুপিটার নোটবুকের প্রয়োজন নেই (অর্থাত্ কোনও ডেটা / ডেটার প্রকারগুলি পরিবর্তন না করে কোনও ডেটা ফ্রেমের আউটপুট আউট করার জন্য )।

স্টাইলার অবজেক্টেরও একটি পদ্ধতি রয়েছে render(), যদি আপনি এইচটিএমএল কোডের সাথে একটি স্ট্রিং পেতে চান (যেমন ওয়েবে আপনার ফরম্যাটযুক্ত ডেটা ফ্রেম প্রকাশ করার জন্য, বা কেবল আপনার টেবিলটি HTML ফর্ম্যাটে উপস্থাপন করুন):

df_styler = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")})
HTML_string = df_styler.render()

এটি উল্লেখ করার মতো যে স্টাইলার কোডটি এটির অধীনে চালিত হওয়ার উদ্দেশ্যে করা হয়েছিল এবং এটি কেবল বৃহত্তর নোটবুকের অধীনে কার্যকর হয় এবং কনসোল বা আইপিসনে চালিত হওয়ার সময় একেবারে শূন্য কার্যকর হয় । ওপি "বৃহস্পতির অধীনে" নির্দিষ্ট করে নি, সুতরাং এটি তাদের সেটআপের উপর নির্ভর করে একটি কার্যকর সমাধান হতে পারে বা নাও পারে। প্রচুর ডেটা সায়েন্স কোড কপিরাইট-এ-পেস্ট হয়ে যায় এবং জুপিটার-নির্দিষ্ট অনুমানগুলি স্পষ্টভাবে নির্দিষ্ট হয় না, তখন লোকেরা আশ্চর্য হয় যে তাদের (কনসোল) পরিবেশে চালানোর সময় স্টাইলার কোডটি কেন "কাজ করে না"।
স্মি

@ এসএমসি, আমার উত্তরের দ্বিতীয় অনুচ্ছেদে স্পষ্টভাবে উল্লেখ করা হয়নি? শর্তসাপেক্ষে if, প্রতিটি প্রোগ্রামার জন্য বিবৃতি তাই আকারে ? - তবুও এটি আপনার মন্তব্যের জন্য ধন্যবাদ, এটি কিছু লোকের পক্ষে সহায়ক হতে পারে।
মারিয়ানডি

না এটি খুব স্পষ্ট নয়, সমাহিতও। মূল প্রশ্নটি জুপিটার সম্পর্কে কিছুই মনে করে না, এবং ওপি এবং কিছু ব্যবহারকারী তাদের কাছে জুপিটার নাও পেতে পারে। আপনার উত্তরটির প্রথম সারিতে বোল্ডফেসে বলা দরকার "নিম্নলিখিত পদ্ধতির (স্টাইলিং) কেবলমাত্র জপিটার নোটবুকের অধীনে কাজ করে এবং জুপিটার নোটবুকের বাইরে চলাকালীন কোনও প্রভাব পড়বে না" । (ডেটা সায়েন্স ব্লগ এবং সাইটগুলিতে আমি দৈনিক ভিত্তিতে লোকেরা জুপিটার কোডটি জুপিটার পরিবেশে পোস্ট করে এবং কেন এটি কার্যকর হয় না তা ভাবছে)।
smci

শীতল। আমি আপনাকে অন্য সমস্ত "অনেকগুলি সমস্যা" যুক্ত করতে পরামর্শ দিয়েছি যা আপনি অন্য "pd.to_datetime- এর সাথে স্ট্রফটাইম-এর সাথে আবার-পিডি-টু-ডেটটাইম-এর সাথে আবার-রূপান্তর-তে-স্ট্রিং-রূপান্তর করুন" তে চিহ্নিত করেছেন। কমপক্ষে, ব্যতিক্রম উত্থাপন এবং আকর্ষণীয় উল্লেখ করা প্রয়োজন। এছাড়াও, pd.to_datetime()এটি errors='raise'/'coerce'/'ignore', dayfirst, yearfirst, utc, exactকতটা সুনির্দিষ্ট এবং ব্যতিক্রম-খুশি এবং অবৈধ আউটপুটগুলিতে জোর দেওয়া হয় NaTবা কী তা নিয়ন্ত্রণ করার জন্য যুক্তি রয়েছে । "রিয়েল-ওয়ার্ল্ড" ডেটাসেটগুলিতে এটি কী আরও জটিল করে তোলে তা মিশ্র / নিখোঁজ / অসম্পূর্ণ ফর্ম্যাট, সময়, সময় অঞ্চল ইত্যাদি etc ব্যতিক্রমগুলি অগত্যা খারাপ জিনিস নয়।
smci

... অথবা অন্যথায় আমি লিখতে পারি যে নন-জুপিটারের নিকটবর্তী স্থানে থাকা সমস্যাগুলির রোলআপ হিসাবে।
স্মি

2

আপনি এটি চেষ্টা করতে পারেন এটি তারিখের ফর্ম্যাটটিকে DD-MM-YYYY এ রূপান্তর করবে:

df['DOB'] = pd.to_datetime(df['DOB'], dayfirst = True)

না! dayfirst=Trueকেবলমাত্র তারিখ বিশ্লেষণের আদেশের স্পেসিফিকেশন, উদাহরণস্বরূপ যে "2-1-2019" হিসাবে দ্বিখণ্ডিত তারিখের স্ট্রিংটি 1 জানুয়ারী, 2019 হিসাবে পার্স করা হবে, ফেব্রুয়ারী 1, 2019 হিসাবে নয় output আরও কিছু নয়, আউটপুট বিন্যাসে কোনও পরিবর্তন হবে না
মেরিয়ানড

1

নীচে কোড পরিবর্তিত হয়ে 'ডেটটাইম' টাইপ করে এবং প্রদত্ত ফর্ম্যাট স্ট্রিংয়ে ফর্ম্যাট করে। ভাল কাজ করে!

df['DOB']=pd.to_datetime(df['DOB'].dt.strftime('%m/%d/%Y'))

4
এটিতে এটি পরিবর্তন করুন:df['DOB']=pd.to_datetime(df['DOB']).dt.strftime('%m/%d/%Y')
জন দো

না! - কেন ডেটটাইমকে স্ট্রিংয়ে রূপান্তর করতে হবে এবং তারপরে ডেটটাইমে ফিরে যাবেন ? অন্যান্য উত্তর আমার মন্তব্য দেখুন।
মেরিয়ানড

0

নীচে কোডটি আমার জন্য কাজ করেছে এবং আমাদের ফর্ম্যাটের জন্য খুব সতর্ক হওয়া দরকার। নীচের লিঙ্কটি আপনার বহির্গমন ফর্ম্যাটটি জানতে এবং পছন্দসই বিন্যাসে পরিবর্তনের জন্য (strftime () অনুসরণ করুন এবং নীচের লিঙ্কে স্ট্রিমটাইম () ফর্ম্যাট কোডগুলি) কার্যকরভাবে কার্যকর হবে:

https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behaviour।

data['date_new_format'] = pd.to_datetime(data['date_to_be_changed'] , format='%b-%y')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.