पांडस डेटाइम कॉलम से अलग केवल महीना और वर्ष निकालना


221

मेरे पास निम्न स्तंभ के साथ एक डेटाफ्रेम, डीएफ है:

df['ArrivalDate'] =
...
936   2012-12-31
938   2012-12-29
965   2012-12-31
966   2012-12-31
967   2012-12-31
968   2012-12-31
969   2012-12-31
970   2012-12-29
971   2012-12-31
972   2012-12-29
973   2012-12-29
...

स्तंभ के तत्व pandas.tslib.Timestamp हैं।

मैं सिर्फ साल और महीने को शामिल करना चाहता हूं। मैंने सोचा कि इसे करने का सरल तरीका होगा, लेकिन मैं इसका पता नहीं लगा सकता।

यहाँ मैंने कोशिश की है:

df['ArrivalDate'].resample('M', how = 'mean')

मुझे निम्नलिखित त्रुटि मिली:

Only valid with DatetimeIndex or PeriodIndex 

फिर मैंने कोशिश की:

df['ArrivalDate'].apply(lambda(x):x[:-2])

मुझे निम्नलिखित त्रुटि मिली:

'Timestamp' object has no attribute '__getitem__' 

कोई सुझाव?

संपादित करें: मुझे यह समझ में आया।

df.index = df['ArrivalDate']

फिर, मैं इंडेक्स का उपयोग करके दूसरे कॉलम को फिर से भेज सकता हूं।

लेकिन मैं अभी भी पूरे कॉलम को पुन: कॉन्फ़िगर करने के लिए एक विधि की तरह हूं। कोई विचार?


11
सबसे अच्छा उत्तर स्पष्ट रूप से है .. df ['mnth_yr'] = df.date_column.dt.to_period ('M') @ jaknap32 से नीचे
ihightower

1
आपको यह भी करने की आवश्यकता नहीं है to_period: df.date_column.dt.month(या .year, या .day) काम करता है
elz


2
@elphz: .dt.monthहालांकि वर्ष खो देता है। और .dt.to_period('M')डेटा प्रकार को किसी ऐसी चीज़ में बदलता है जो डेटाइम 64 नहीं है। मैंने जुआन के जवाब का उपयोग करके .astype('datetime64[M]')मूल्यों को कम करने का सुझाव दिया।
निकोले

क्या आप सबसे अच्छा जवाब बदल सकते हैं?
गोंजालो गार्सिया

जवाबों:


306

यदि आप चाहते हैं कि वर्ष और माह अलग से दिखा रहे नए कॉलम आप ऐसा कर सकें:

df['year'] = pd.DatetimeIndex(df['ArrivalDate']).year
df['month'] = pd.DatetimeIndex(df['ArrivalDate']).month

या ...

df['year'] = df['ArrivalDate'].dt.year
df['month'] = df['ArrivalDate'].dt.month

फिर आप उन्हें जोड़ सकते हैं या उनके साथ काम कर सकते हैं जैसे वे हैं।


7
क्या एक लाइन में ऐसा करने का कोई तरीका है? मैं एक ही कॉलम को कई बार ट्रेस करने से बचना चाहता हूं।
16:19 बजे fixxxer

2
कुछ त्वरित बेंचमार्किंग से timeitपता चलता है कि DatetimeIndexदृष्टिकोण .map/.applyया तो की तुलना में काफी तेज है या .dt
स्नोरफॉर्पलागस

2
सबसे अच्छा उत्तर स्पष्ट रूप से है .. df ['mnth_yr'] = df.date_column.dt.to_period ('M') @ jaknap32 से नीचे
ihightower

वास्तव में पीडी क्या करता है।
जॉन्स

मैं कभी-कभी ऐसा करता हूं: df['date_column_trunc'] = df[date_column'].apply(lambda s: datetime.date(s.year, s.month, 1)
स्टीवर्का

229

सबसे अच्छा तरीका मिला !!

df['date_column']दिनांक समय प्रारूप में हो गया है।

df['month_year'] = df['date_column'].dt.to_period('M')

आप Dदिन के 2Mलिए 2 महीने आदि के लिए भी अलग-अलग नमूने अंतराल के लिए उपयोग कर सकते हैं , और यदि किसी के पास समय की मोहर के साथ समय श्रृंखला डेटा है, तो हम दानेदार नमूना अंतराल जैसे कि 45Min45 मिनट के लिए, 15Min15 मिनट के नमूने के लिए आदि जा सकते हैं।


8
ध्यान दें कि परिणामी कॉलम datetime64अब dtype का नहीं है। का उपयोग करते हुए df.my_date_column.astype('datetime64[M]'), जैसा कि @ जुआन का जवाब प्रत्येक माह के पहले दिन का प्रतिनिधित्व करने वाली तिथियों में परिवर्तित होता है।
निकोले

3
मुझे आश्चर्य है कि यह सब यहाँ नीचे है।
टिम

154

आप सीधे yearऔर monthविशेषताओं तक पहुँच सकते हैं , या अनुरोध कर सकते हैं datetime.datetime:

In [15]: t = pandas.tslib.Timestamp.now()

In [16]: t
Out[16]: Timestamp('2014-08-05 14:49:39.643701', tz=None)

In [17]: t.to_pydatetime() #datetime method is deprecated
Out[17]: datetime.datetime(2014, 8, 5, 14, 49, 39, 643701)

In [18]: t.day
Out[18]: 5

In [19]: t.month
Out[19]: 8

In [20]: t.year
Out[20]: 2014

वर्ष और महीने को संयोजित करने का एक तरीका यह है कि उन्हें पूर्णांक एन्कोडिंग बनाया जाए, जैसे: 201408अगस्त, 2014 के लिए। पूरे कॉलम के साथ, आप इसे इस प्रकार कर सकते हैं:

df['YearMonth'] = df['ArrivalDate'].map(lambda x: 100*x.year + x.month)

या इसके कई प्रकार हैं।

मैं ऐसा करने का बहुत बड़ा प्रशंसक नहीं हूँ, हालाँकि, क्योंकि यह बाद में संरेखण और अंकगणितीय दर्दनाक बनाता है और विशेष रूप से दूसरों के लिए दर्दनाक है जो इस समान सम्मेलन के बिना आपके कोड या डेटा पर आते हैं। एक बेहतर तरीका यह है कि एक महीने के सम्मेलन को चुना जाए, जैसे कि अंतिम गैर-यूएस-अवकाश सप्ताह के दिन, या पहले दिन, आदि, और चुने हुए तिथि सम्मेलन के साथ डेटा को दिनांक / समय प्रारूप में छोड़ दें।

calendarमॉड्यूल इस तरह के अंतिम कार्य दिवस पर के रूप में कुछ दिनों की संख्या मूल्य प्राप्त करने के लिए उपयोगी है। तब आप कुछ ऐसा कर सकते थे:

import calendar
import datetime
df['AdjustedDateToEndOfMonth'] = df['ArrivalDate'].map(
    lambda x: datetime.datetime(
        x.year,
        x.month,
        max(calendar.monthcalendar(x.year, x.month)[-1][:5])
    )
)

यदि आप कुछ कठोर प्रतिनिधित्व में डेटाटाइम कॉलम को प्रारूपित करने की सरल समस्या को हल करने के लिए एक रास्ता खोज रहे हैं, तो इसके लिए आप केवल कक्षा strftimeसे फ़ंक्शन का उपयोग कर सकते हैं datetime.datetime, जैसे:

In [5]: df
Out[5]: 
            date_time
0 2014-10-17 22:00:03

In [6]: df.date_time
Out[6]: 
0   2014-10-17 22:00:03
Name: date_time, dtype: datetime64[ns]

In [7]: df.date_time.map(lambda x: x.strftime('%Y-%m-%d'))
Out[7]: 
0    2014-10-17
Name: date_time, dtype: object

4
प्रदर्शन खराब हो सकता है, इसलिए सहायक कार्यों, वेक्टरकृत संचालन और pandasविभाजन-लागू-संयोजन तकनीकों का सर्वोत्तम संभव उपयोग करना हमेशा अच्छा होता है। ऊपर दिए गए मेरे सुझावों को एक समर्थन के रूप में नहीं लिया जाना चाहिए कि वे आपके मामले के लिए सबसे अधिक उपयोगी दृष्टिकोण हैं - बस यह कि वे कई मामलों के लिए स्टाइलिश रूप से मान्य पायथोनिक विकल्प हैं।
Ely

@KieranPC द्वारा नीचे दिया गया उत्तर बहुत अधिक तेज़ है
बेन

2
सबसे अच्छा उत्तर स्पष्ट रूप से है .. df ['mnth_yr'] = df.date_column.dt.to_period ('M') @ jaknap32 से नीचे
ihightower

2
आप 100 से गुणा करने वाले हैं df['YearMonth'] = df['ArrivalDate'].map(lambda x: 1000*x.year + x.month)
गिट जुड

1
@ zthomas.nc मुझे लगता है कि वे दो अलग-अलग उत्तरों के रूप में बेहतर कार्य करते हैं, क्योंकि वे इसे हल करने के लिए दो बहुत अलग तरीके पेश करते हैं।
एली

34

यदि आप महीने के अद्वितीय जोड़ी चाहते हैं, तो आवेदन का उपयोग बहुत चिकना है।

df['mnth_yr'] = df['date_column'].apply(lambda x: x.strftime('%B-%Y')) 

एक कॉलम में महीने-साल का आउटपुट।

पहले प्रारूप को दिनांक-समय में बदलना न भूलें, मैं आमतौर पर भूल जाता हूं।

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

आप लंबोदर समारोह से भी बच सकते हैं:df['month_year'] = df['date_column'].dt.strftime('%B-%Y')
ऋषभ

13

वर्ष निकालना ['2018-03-04'] से

df['Year'] = pd.DatetimeIndex(df['date']).year  

Df ['वर्ष'] एक नया स्तंभ बनाता है। यदि आप महीने निकालना चाहते हैं, तो केवल .month का उपयोग करें


1
धन्यवाद, यह वास्तव में उपयोगी तारीख है। दिन # दिन के लिए--
एडविन टॉरेस

7

आप पहले अपनी डेट स्ट्रिंग्स को pandas.to_datetime के साथ परिवर्तित कर सकते हैं , जो आपको सभी सुपीरियर डेटाटाइम और टाइमडेलटा सुविधाओं तक पहुंच प्रदान करता है। उदाहरण के लिए:

df['ArrivalDate'] = pandas.to_datetime(df['ArrivalDate'])
df['Month'] = df['ArrivalDate'].values.astype('datetime64[M]')

यह मेरे लिए वास्तव में अच्छी तरह से काम करता था, जैसा कि मैं pyspark के अनुरूप कार्यक्षमता की तलाश में था trunc। क्या astype('datetime64[M]')अधिवेशन के लिए कोई दस्तावेज है ?
h1-the-swan

6

Jaknap32 के लिए धन्यवाद , मैं वर्ष और महीने के अनुसार परिणाम एकत्र करना चाहता था, इसलिए यह काम किया:

df_join['YearMonth'] = df_join['timestamp'].apply(lambda x:x.strftime('%Y%m'))

उत्पादन साफ ​​था:

0    201108
1    201108
2    201108

6

@ किरनपीसी का समाधान पंडों के लिए सही दृष्टिकोण है, लेकिन आसानी से मनमानी विशेषताओं के लिए विस्तार योग्य नहीं है। इसके लिए, आप getattrएक जनरेटर समझ के भीतर उपयोग कर सकते हैं और संयोजन का उपयोग कर सकते हैं pd.concat:

# input data
list_of_dates = ['2012-12-31', '2012-12-29', '2012-12-30']
df = pd.DataFrame({'ArrivalDate': pd.to_datetime(list_of_dates)})

# define list of attributes required    
L = ['year', 'month', 'day', 'dayofweek', 'dayofyear', 'weekofyear', 'quarter']

# define generator expression of series, one for each attribute
date_gen = (getattr(df['ArrivalDate'].dt, i).rename(i) for i in L)

# concatenate results and join to original dataframe
df = df.join(pd.concat(date_gen, axis=1))

print(df)

  ArrivalDate  year  month  day  dayofweek  dayofyear  weekofyear  quarter
0  2012-12-31  2012     12   31          0        366           1        4
1  2012-12-29  2012     12   29          5        364          52        4
2  2012-12-30  2012     12   30          6        365          52        4

1
df['year_month']=df.datetime_column.apply(lambda x: str(x)[:7])

यह मेरे लिए ठीक काम किया, नहीं सोचा था कि पांडा परिणाम स्ट्रिंग की तारीख की तारीख के रूप में व्याख्या करेंगे, लेकिन जब मैंने साजिश की, तो यह बहुत अच्छी तरह से मेरा एजेंडा जानता था और स्ट्रिंग वर्ष_मंथन जहां ठीक से आदेश दिया गया ... प्रेम पंडों!


1

पद्धति लागू किए बिना सभी डेटाफ़्रेम के लिए वर्ष निकालने के लिए दो चरण हैं।

चरण 1

कॉलम को डेटाइम में बदलें:

df['ArrivalDate']=pd.to_datetime(df['ArrivalDate'], format='%Y-%m-%d')

चरण 2

DatetimeIndex()विधि का उपयोग करके वर्ष या महीना निकालें

 pd.DatetimeIndex(df['ArrivalDate']).year

1

एकल लाइन: 'वर्ष-माह'-जोड़े के साथ एक कॉलम जोड़ना: ('pd.to_datetime' पहले कॉलम dtype को ऑपरेशन से पहले दिनांक-समय में बदलता है)

df['yyyy-mm'] = pd.to_datetime(df['ArrivalDate']).dt.strftime('%Y-%m')

तदनुसार एक अतिरिक्त 'वर्ष' या 'महीने' कॉलम के लिए:

df['yyyy'] = pd.to_datetime(df['ArrivalDate']).dt.strftime('%Y')

df['mm'] = pd.to_datetime(df['ArrivalDate']).dt.strftime('%m')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.