मैं पंडों के डेटा फ्रेम में तारीखों को 'डेट' डेटा प्रकार में कैसे परिवर्तित करूं?


104

मेरे पास पंडों का डेटा फ्रेम है, कॉलम में से एक में प्रारूप में तारीख के तार हैं YYYY-MM-DD

उदाहरण के लिए '2013-10-28'

dtypeस्तंभ के क्षण में है object

मैं कॉलम मानों को पंडों की तारीख के प्रारूप में कैसे परिवर्तित करूं?

जवाबों:


109

Astype का उपयोग करें

In [31]: df
Out[31]: 
   a        time
0  1  2013-01-01
1  2  2013-01-02
2  3  2013-01-03

In [32]: df['time'] = df['time'].astype('datetime64[ns]')

In [33]: df
Out[33]: 
   a                time
0  1 2013-01-01 00:00:00
1  2 2013-01-02 00:00:00
2  3 2013-01-03 00:00:00

1
अच्छा - धन्यवाद - मैं प्रत्येक तिथि के अंत में 00:00:00 से कैसे छुटकारा पाऊँ?
user7289

1
पांडा टाइमस्टैम्प में तारीख और समय दोनों होते हैं। क्या आप इसका मतलब अजगर डेट ऑब्जेक्ट में बदल सकते हैं?
वेटाकुओ

7
आप द्वारा रूपांतरित कर सकते हैंdf['time'] = [time.date() for time in df['time']]
waitingkuo

3
[ns] का क्या अर्थ है, क्या आप पाठ स्ट्रिंग को एक तारीख बना सकते हैं और उस तिथि के समय भाग को हटा सकते हैं?
योशिसेरी

1
@yoshiserry यह नैनोसेकंड है, और जिस तरह से दिनांक हुड के नीचे जमा होते हैं एक बार ठीक से परिवर्तित हो जाते हैं (नैनो-सेकंड में युग-समय)।
एंडी हेडन

113

अनिवार्य रूप से @waitingkuo के बराबर है, लेकिन मैं to_datetimeयहां उपयोग करूंगा (यह थोड़ा साफ लगता है, और कुछ अतिरिक्त कार्यक्षमता प्रदान करता है जैसे dayfirst):

In [11]: df
Out[11]:
   a        time
0  1  2013-01-01
1  2  2013-01-02
2  3  2013-01-03

In [12]: pd.to_datetime(df['time'])
Out[12]:
0   2013-01-01 00:00:00
1   2013-01-02 00:00:00
2   2013-01-03 00:00:00
Name: time, dtype: datetime64[ns]

In [13]: df['time'] = pd.to_datetime(df['time'])

In [14]: df
Out[14]:
   a                time
0  1 2013-01-01 00:00:00
1  2 2013-01-02 00:00:00
2  3 2013-01-03 00:00:00

हैंडलिंग ValueErrorएस
यदि आप ऐसी स्थिति में भाग लेते हैं जहां कर रहे हैं

df['time'] = pd.to_datetime(df['time'])

फेंकता है

ValueError: Unknown string format

इसका मतलब है कि आपके पास अमान्य (गैर-सहिष्णु) मूल्य हैं। यदि आप उन्हें परिवर्तित करने के लिए ठीक हैं pd.NaT, तो आप इसमें एक errors='coerce'तर्क जोड़ सकते हैं to_datetime:

df['time'] = pd.to_datetime(df['time'], errors='coerce')

हाय दोस्तों, @AndyHayden क्या आप तारीख से समय का हिस्सा निकाल सकते हैं? मुझे उस हिस्से की ज़रूरत नहीं है?
योशिसेरी

पांडा '0.13.1 में अनुगामी 00: 00: 00s प्रदर्शित नहीं होते हैं।
एंडी हेडन

और अन्य संस्करणों के बारे में क्या है, हम उन्हें कैसे हटाते हैं / या प्रदर्शित नहीं करते हैं?
योशिसेरी

मुझे नहीं लगता कि यह एक अच्छे तरीके से किया जा सकता है, फ्लोट_फॉर्मैट (जो आपने देखा है) की तरह डेट_फॉर्मेट को जोड़ने के लिए चर्चा है। मैं वैसे भी अपग्रेड करने की सलाह देता हूं।
एंडी हेडन

मेरी समस्या मेरी तिथि इस प्रारूप में है ... 41516.43, और मुझे यह त्रुटि मिली। मुझे उम्मीद है कि यह नए कॉलम में 2014-02-03 की तरह कुछ लौटाएगा ?! त्रुटि: बजट_dataset ['date_last_load'] = pd.to_datetime (बजट_डेटाट ['load_date]]) बजट_dataset -c: 2: SettingWithCopyWarning: मान के लिए "मान_ लोड करें" कॉलम में "पिछली तारीख के मान" एक DataFrame से एक टुकड़ा की प्रतिलिपि। .Loc का उपयोग करने का प्रयास करें [row_index, col_indexer] = मान के बजाय
yoshiserry

35

मैं कल्पना करता हूं कि बहुत सारे डेटा CSV फ़ाइलों से पंडों में आते हैं, जिस स्थिति में आप प्रारंभिक CSV रीडिंग के दौरान दिनांक को परिवर्तित कर सकते हैं:

dfcsv = pd.read_csv('xyz.csv', parse_dates=[0])जहाँ दिनांक उस स्तंभ को संदर्भित करता है जिसमें दिनांक है। यदि आप चाहते हैं कि दिनांक आपके अनुक्रमणिका में हो तो
भी आप इसमें जोड़ , index_col=0सकते हैं।

Https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html देखें


धन्यवाद, यह वही था जो मुझे चाहिए था। प्रलेखन स्थानांतरित हो गया है, हालांकि, आप इसे यहां पा सकते हैं: pandas.pydata.org/pandas-docs/stable/reference/api/…
Sastibe

24

अब आप कर सकते हैं df['column'].dt.date

ध्यान दें कि डेटाटाइम ऑब्जेक्ट्स के लिए, यदि आप घंटे नहीं देखते हैं जब वे सभी 00:00:00 बजे होते हैं, तो यह पांडा नहीं है। यह iPython नोटबुक चीजों को सुंदर बनाने की कोशिश कर रहा है।


2
यह मेरे लिए काम नहीं करता है, यह शिकायत करता है: केवल डेटा का उपयोग कर सकते हैं। datetimelike मूल्यों के साथ accessor
smishra

2
आपको df[col] = pd.to_datetime(df[col])अपने कॉलम को समय की वस्तुओं में बदलने के लिए पहले करना पड़ सकता है ।
मेज़िटलिन

इस उत्तर के साथ मुद्दा यह है कि यह स्तंभ को परिवर्तित करता है dtype = objectजो datetime dtypeपांडा में एक सच्चे की तुलना में काफी अधिक स्मृति लेता है ।
इलास्टैस्टर

6

ऐसा करने का एक और तरीका है और यह अच्छी तरह से काम करता है यदि आपके पास कई कॉलम हैं जो डेटाइम में परिवर्तित हो सकते हैं।

cols = ['date1','date2']
df[cols] = df[cols].apply(pd.to_datetime)

डेट डेटटाइम नहीं करने के लिए प्रश्न पूछें।
मार्क एंडरसन

@MarkAndersen जब तक आप dateअपने कॉलम में केवल मान रखते हैं, डेटाटाइम में कनवर्ट केवल जानकारी से संबंधित बनाए रखेगा। यदि आप अन्वेषण का उपयोग करके परिवर्तित करते हैं df['datetime_col'].dt.date, तो इसका परिणाम objectdtype होगा; स्मृति प्रबंधन में कमी।
सुमंत लाजर


1

यह मामला हो सकता है कि तिथियों को एक अलग आवृत्ति में परिवर्तित करने की आवश्यकता हो। इस मामले में, मैं तारीखों द्वारा एक सूचकांक निर्धारित करने का सुझाव दूंगा।

#set an index by dates
df.set_index(['time'], drop=True, inplace=True)

इसके बाद, आप अधिक आसानी से उस तारीख प्रारूप के प्रकार में परिवर्तित हो सकते हैं जिसकी आपको सबसे अधिक आवश्यकता होगी। नीचे, मैं क्रमिक रूप से कई दिनांक प्रारूपों में परिवर्तित होता हूं, अंत में महीने की शुरुआत में दैनिक तिथियों के एक सेट के साथ समाप्त होता है।

#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)

#Convert to monthly dates
df.index = df.index.to_period(freq='M')

#Convert to strings
df.index = df.index.strftime('%Y-%m')

#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)

संक्षिप्तता के लिए, मैं यह नहीं दिखाता कि मैं ऊपर प्रत्येक पंक्ति के बाद निम्न कोड चलाता हूं:

print(df.index)
print(df.index.dtype)
print(type(df.index))

यह मुझे निम्न आउटपुट देता है:

Index(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='object', name='time')
object
<class 'pandas.core.indexes.base.Index'>

DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='datetime64[ns]', name='time', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>

PeriodIndex(['2013-01', '2013-01', '2013-01'], dtype='period[M]', name='time', freq='M')
period[M]
<class 'pandas.core.indexes.period.PeriodIndex'>

Index(['2013-01', '2013-01', '2013-01'], dtype='object')
object
<class 'pandas.core.indexes.base.Index'>

DatetimeIndex(['2013-01-01', '2013-01-01', '2013-01-01'], dtype='datetime64[ns]', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>

0

Pd.to_datetime फ़ंक्शन का उपयोग करके पंक्तियों में से किसी एक को टाइमस्टैम्प में परिवर्तित करने का प्रयास करें और फिर संपूर्ण स्तंभ के लिए फ़ॉर्म्यूलर को मैप करने के लिए .map का उपयोग करें


0
 #   Column          Non-Null Count   Dtype         
---  ------          --------------   -----         
 0   startDay        110526 non-null  object
 1   endDay          110526 non-null  object

import pandas as pd

df['startDay'] = pd.to_datetime(df.startDay)

df['endDay'] = pd.to_datetime(df.endDay)

 #   Column          Non-Null Count   Dtype         
---  ------          --------------   -----         
 0   startDay        110526 non-null  datetime64[ns]
 1   endDay          110526 non-null  datetime64[ns]

0

पूर्णता की खातिर, एक और विकल्प, जो सबसे सीधा नहीं हो सकता है, जो @SSS द्वारा प्रस्तावित एक के समान है, लेकिन इसके बजाय डेटाइम लाइब्रेरी का उपयोग करना है:

import datetime
df["Date"] = df["Date"].apply(lambda x: datetime.datetime.strptime(x, '%Y-%d-%m').date())
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.