पंडों में डेटाटाइम प्रारूप को कैसे बदलें


109

मेरे डेटाफ़्रेम में एक 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प्रारूप में तारीख दिखाता है ।


क्या आप एक समाधान की तलाश कर रहे हैं जो केवल जुपिटर नोटबुक के तहत काम करता है? (किस मामले में प्रति-स्तंभ 'स्टाइलर' का उपयोग करें) या सादे पायथन कंसोल और iPython में काम करता है?
मुस्कान

जवाबों:


207

आप उपयोग कर सकते हैं 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

32
'strftime' DOB1 पर ऑपरेशन को लागू करने के लिए डेटाटाइम कॉलम को यूनिकोड में परिवर्तित करता है, हमें फिर से इसे डेटाटाइम में बदलना होगा। क्या data_type को खोए बिना कोई अन्य तरीका नहीं है?
एम। ज़मान

@ जेज़रेल, क्या कोई बेहतर समाधान है जो डेटाटाइप को भी बनाए रखता है और किसी ऑब्जेक्ट कॉलम पर तारीखें वापस नहीं करता है? समस्या यह है कि यदि लाइन 'df [' DOB1 '] = df ['OB']] dt.strftime ('% m /% d /% Y') के बाद इसे रूपांतरित करने का प्रयास करें क्योंकि यह समाधान पर सुझाया गया है। इसके बाद की तारीखें अपने मूल प्रारूप में वापस आ जाती हैं।
निर्वासित

हाहा, तो मैं यह कैसे कर सकता हूं यदि मैं उपयोग करना चाहता हूं तो यह कॉलम .mergeकिसी अन्य डेटाफ्रेम के डेटाइम कॉलम पर है? यह किसी भी वस्तु के लिए अन्य डेटाटाइम कॉलम में परिवर्तित करने के लिए कोई मतलब नहीं है .merge?
आउटकास्ट'

हाँ जाहिरा तौर पर मैं सहमत हूं लेकिन द्वारा "मौजूद :(" क्या आप मुझसे कहा कि मैं अपने नए स्वरूप खोने के बिना इसका स्वरूप बदलने के बाद datetime करने के लिए स्तंभ परिवर्तित नहीं कर सकते तो।?
निर्वासित

ठीक है, जहां तक ​​मैं समझता हूं, .mergeअभी भी सही ढंग से किया जा सकता है यदि दोनों कॉलम डेटाइम कॉलम हैं, भले ही उनका प्रारूप समान नहीं हो। क्या यह सही है?
निर्वासित

21

स्वरूप बदलना लेकिन प्रकार नहीं बदलना:

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

बस यह याद रखें कि df ["तारीख"] आपको ऐसा करने से पहले datetime64 होना चाहिए
adhg

4
नहीं! मान लीजिए कि dateकॉलम में कुछ आइटम का मूल मूल्य " 26 नवंबर , 2019" है। "समय से स्ट्रिंग" काstrftime() अर्थ है , इसलिए उस आइटम के लिए एक स्ट्रिंग होगा । फिर, इस स्ट्रिंग में परिवर्तित कर देंगे वापस करने के लिए के रूप में "नवंबर अब प्रारूप है, लेकिन 1 , 2019"! तो परिणाम यह होगा: कोई प्रारूप नहीं बदलता है, लेकिन तिथि मान में परिवर्तन होता है! df["date"].dt.strftime('%Y-%m') "2019-11"pd.to_datetime()datetime64
मैरिएड

2
@ मेरियनड: व्यक्तिगत उत्तरों पर आपकी सभी टिप्पणियां उपयोगी हैं, लेकिन क्या आप अपने जवाब के निचले भाग में "नुकसान / न करें" के एक रोलअप में उन्हें संक्षेप में बता सकते हैं? इसके अलावा, आपको यह स्पष्ट रूप से बताने की आवश्यकता है कि इनमें से प्रत्येक के साथ समस्या क्या है: यदि इनपुट तिथियों में से कोई भी अपेक्षित प्रारूप में नहीं है, तो ये या तो अपवादों को फेंकने का जोखिम उठाएंगे, या तारीख को जोड़ देंगे। बस "नहीं!" हर जगह यह व्यक्त नहीं करता है।
मुस्कान

8

नीचे दिए गए कोड ने पिछले एक के बजाय मेरे लिए काम किया - इसे आज़माएं!

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

2
नहीं! आपका format='%m/%d/%Y'पैरामीटर एक स्ट्रिंग को पार्स करने के लिए है , अर्थात आपको ऐसे प्रारूप में स्ट्रिंग प्रदान करना चाहिए (जैसे "5/13/2019")। और कुछ नहीं, कोई प्रारूप नहीं बदलता। यह अभी भी प्रदर्शित किया जाएगा 2019-05-13- या यह एक अपवाद को बढ़ाएगा, यदि df['DOB'].astype(str)इसमें कोई आइटम नहीं है, जैसे कि प्रारूप में नहीं, उदाहरण के लिए "2019-05-13"
मैरिएड

4

पहले उत्तर की तुलना में, मैं पहले dt.strftime () का उपयोग करने की सलाह दूंगा, फिर pd.to_datetime ()। इस तरह, यह अभी भी डेटाटाइम डेटा प्रकार में परिणाम होगा।

उदाहरण के लिए,

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)

2
यह मेरे मामले में कम से कम काम नहीं करता है। विशेष रूप से, स्तंभ डेटाटाइम डेटा प्रकार में परिवर्तित हो जाता है, लेकिन मूल स्वरूप में भी मान परिवर्तित हो जाते हैं!
निर्वासित

नहीं! सिंटैक्स त्रुटि (गुम ब्रेस), पंडों के मेरे संस्करण में (0.25.1) एक और सिंटैक्स त्रुटि (dt.strftime () - केवल datetimelike मानों के साथ .dt एक्सेसर का उपयोग कर सकते हैं) - आप अंतर्निहित डेटा प्रकार पर निर्भर करते हैं, लेकिन विभिन्न संस्करणों में। पंडों के निहित डेटा प्रकार अलग हो सकते हैं), और एक अजीब तर्क - क्यों डेटाइम को स्ट्रिंग में परिवर्तित करने और फिर वापस डेटटाइम करने के लिए ? ऋषि जैन के जवाब के लिए मेरी टिप्पणी देखें।
मैरिएड

2

के बीच अंतर है

  • सामग्री एक dataframe सेल की (एक द्विआधारी मूल्य) और
  • इसकी प्रस्तुति (इसे प्रदर्शित करना) हमारे लिए, मनुष्य।

तो सवाल यह है: अपने डेटा / डेटा प्रकारों को बदलने के बिना मेरे डेटा की उपयुक्त प्रस्तुति तक कैसे पहुंचें ?

यहाँ जवाब है:

  • यदि आप अपने डेटाफ्रेम को प्रदर्शित करने के लिए Jupyter नोटबुक का उपयोग करते हैं , या
  • आप एक के रूप में एक प्रस्तुति पहुंचना चाहते हैं HTML फ़ाइल (यहां तक कि कई तैयार ज़रूरत से ज़्यादा के साथ idऔर classके लिए जिम्मेदार बताते हैं आगे सीएसएस स्टाइल - आप या आप उन्हें प्रयोग नहीं हो सकता है),

स्टाइल का उपयोग करें । स्टाइलिंग आपके डेटाफ़्रेम के स्तंभों के डेटा / डेटा प्रकारों को परिवर्तित नहीं करता है।

अब मैं आपको दिखाता हूं कि इसे ज्यूपिटर नोटबुक में कैसे पहुंचा जाए - HTML फ़ाइल के रूप में प्रस्तुति के लिए नोट को प्रश्न के अंत के पास देखें।

मुझे लगता है कि आपके कॉलम में 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संपत्ति द्वारा सुलभ अपनी Styler ऑब्जेक्ट होती है , और हमने इस df.styleऑब्जेक्ट को बदल दिया , न कि डेटाफ़्रेम को ही।)


सवाल और जवाब:

  • प्रश्न: आपकी स्टाइलर ऑब्जेक्ट (या इसे लौटाने वाली एक अभिव्यक्ति) का उपयोग ज्यूपिटर नोटबुक सेल में अंतिम कमांड के रूप में किया गया है जो आपकी (स्टाइल वाली) टेबल को प्रदर्शित करता है , न कि स्टाइलर ऑब्जेक्ट को?

  • A: क्योंकि प्रत्येक Styler ऑब्जेक्ट में कॉलबैक विधि होती है ._repr_html_()जो आपके डेटाफ़्रेम (एक अच्छी HTML तालिका के रूप में) प्रदान करने के लिए एक HTML कोड लौटाती है।

    ज्यूपिटर नोटबुक आईडीई इस पद्धति को स्वचालित रूप से उन वस्तुओं को प्रस्तुत करने के लिए कहता है जिनके पास यह है।


ध्यान दें:

आपको स्टाइलिंग के लिए जुपाइटर नोटबुक की आवश्यकता नहीं है (यानी इसके डेटा / डेटा प्रकारों को बदले बिना किसी डेटाफ़्रेम को अच्छी आउटपुट देने के लिए )।

एक Styler ऑब्जेक्ट में एक विधि है render(), भी, यदि आप HTML कोड के साथ एक स्ट्रिंग प्राप्त करना चाहते हैं (उदाहरण के लिए वेब पर अपने स्वरूपित डेटाफ़्रेम को प्रकाशित करने के लिए, या बस अपनी तालिका को HTML प्रारूप में प्रस्तुत करें):

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

यह इंगित करने के लायक है कि इस तरह का स्टाइलर कोड के तहत चलाने का इरादा है, और केवल जुपिटर नोटबुक के तहत प्रभावी होता है, और कंसोल या आईफ़ोन में चलने पर बिल्कुल शून्य प्रभाव होता है । ओपी ने "जुपिटर के तहत" निर्दिष्ट नहीं किया, इसलिए यह उनके सेटअप के आधार पर व्यवहार्य समाधान हो भी सकता है और नहीं भी। डेटा साइंस कोड के बहुत सारे कॉपी-और-पेस्ट किए जाते हैं, और जुपिटर-विशिष्ट मान्यताओं को स्पष्ट रूप से निर्दिष्ट नहीं किया जाता है, फिर लोग आश्चर्य करते हैं कि स्टाइलर कोड उनके (कंसोल) वातावरण में "काम नहीं करता" क्यों है।
मुस्कान

@smci, मेरे उत्तर के दूसरे पैराग्राफ में स्पष्ट रूप से उल्लिखित नहीं है? सशर्त के रूप में if, बयान हर प्रोग्रामर के लिए जाना जाता है? - इसके बावजूद आपकी टिप्पणी के लिए धन्यवाद, यह कुछ लोगों के लिए मददगार हो सकता है।
मैरियनड

नहीं, यह बहुत अस्पष्ट है, दफन भी। मूल प्रश्न में जुपिटर के बारे में कुछ नहीं कहा गया है, और ओपी और कुछ उपयोगकर्ताओं के पास शायद ज्यूपिटर भी उपलब्ध नहीं है। आपके उत्तर को बोल्डफेस में कहने की आवश्यकता होगी इसकी पहली पंक्ति "निम्नलिखित दृष्टिकोण (स्टाइलिंग) केवल जुपिटर नोटबुक के तहत काम करता है, और जब भी ज्यूपिटर नोटबुक के बाहर चलाया जाता है तो इसका कोई प्रभाव नहीं होगा" । (डेटा विज्ञान ब्लॉग और साइटों में मैं दैनिक आधार पर लोगों को गैर-जुपिटर वातावरण में ज्यूपिटर कोड पोस्ट करने के लिए देखता हूं, और सोचता हूं कि यह काम क्यों नहीं करता है)।
एसएमसीआई

ठंडा। मेरा सुझाव है कि आप दूसरे (कन्वर्ट-टू-स्ट्रिंग-साथ-स्ट्रेटटाइम-तत्कालीन-बैक-अगेन-पीडी-to_datetime "दृष्टिकोण पर पहचाने गए सभी (कई) नुकसानों को जोड़ते हैं। कम से कम, अपवादों को बढ़ाने और पकड़ने का उल्लेख करने की आवश्यकता है। इसके अलावा, pd.to_datetime()इस बात errors='raise'/'coerce'/'ignore', dayfirst, yearfirst, utc, exactको नियंत्रित करने के लिए तर्क हैं कि यह कितना सटीक और अपवाद-खुश है, और क्या अवैध आउटपुट के साथ NaTया क्या करने के लिए मजबूर किया जाता है । "वास्तविक दुनिया" में यह और अधिक जटिल बनाता है कि डेटासेट मिश्रित / गायब / अपूर्ण प्रारूप, समय, टाइमज़ोन, आदि है; अपवाद जरूरी नहीं कि बुरी चीजें हों।
smci

... वरना मैं लिख सकता हूं कि गैर-जुपिटर दृष्टिकोण में नुकसान के रोलअप के रूप में।
एसएमसीआई

1

नीचे दिए गए कोड में 'डेटाइम' प्रकार में परिवर्तन होता है और दिए गए प्रारूप स्ट्रिंग में प्रारूप भी। अच्छा काम करता है!

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

2
इसे इसे बदल दें:df['DOB']=pd.to_datetime(df['DOB']).dt.strftime('%m/%d/%Y')
जॉन डोए

नहीं! - डेटाइम को स्ट्रिंग में क्यों बदलना और फिर वापस डेटटाइम में बदलना ? मेरी टिप्पणियों को अन्य उत्तरों के लिए देखें।
मैरिएड

1

आप यह कोशिश कर सकते हैं कि यह दिनांक प्रारूप को DD-MM-YYYY में बदल देगा:

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

नहीं! dayfirst=Trueकेवल दिनांक पार्स ऑर्डर का विनिर्देश है, उदाहरण के लिए "2-1-2019" के रूप में उभयलिंगी तारीख स्ट्रिंग को 2 जनवरी, 2019 के रूप में पार्स किया जाएगा, और 1 फरवरी, 2019 के रूप में नहींआउटपुट स्वरूपण के लिए कोई परिवर्तन नहीं
मैरिएनड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.