পান্ডাস ডেটটাইম কলাম থেকে আলাদাভাবে মাত্র মাস এবং বছর আহরণ করা হচ্ছে


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) কাজ করে
এলজ


2
@ এলফজ: .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
একক লাইনে এটি করার কোনও উপায় আছে কি? আমি একই কলামটি একাধিকবার অতিক্রম করতে চাই।
ফিক্সক্সিক্সার

2
কিছু দ্রুত সঙ্গে মাপকাঠিতে timeitদাড়ায় যে DatetimeIndexপদ্ধতির উল্লেখযোগ্যভাবে পারেন চেয়ে দ্রুত .map/.applyবা .dt
Snorfalorpagus

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')

আপনি বিভিন্ন নমুনা ব্যবধানের জন্য 2 মাস ইত্যাদির Dজন্যও ডে ব্যবহার করতে পারেন এবং 2Mসময় স্ট্যাম্পের সাথে যদি সময় সিরিজের ডেটা থাকে তবে আমরা দানাদার নমুনা ব্যবধান যেমন 45Min45 মিনিট, 15Min15 মিনিটের নমুনা ইত্যাদির জন্য যেতে পারি etc.


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 এর জন্য a একটি সম্পূর্ণ কলামের পাশাপাশি আপনি এটি করতে পারেন:

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স্প্লিট-প্রয়োগ-সংযুক্ত কৌশলগুলি সর্বোত্তম ব্যবহার করা সর্বদা ভাল । উপরের আমার পরামর্শগুলি এটিকে সমর্থন হিসাবে বোঝানো হয় না যে এগুলি আপনার ক্ষেত্রে সর্বাধিক পারফরম্যান্ট পন্থা - কেবলমাত্র তারা একাধিক মামলার জন্য স্টাইলিস্টিকভাবে বৈধ পাইথোনিক পছন্দ।
এলী

@ কিরানপিসির নীচের উত্তরগুলি অনেক দ্রুত
বেন

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
ধন্যবাদ, এটি সত্যিই সহায়ক হয়েছে ডেট_1_1 = পিডি.ডেটটাইম ইন্ডেক্স (ডিএফ ['তারিখ']) - বছর = তারিখ_1.আর # বছর ধরে ----মাস্তে = তারিখ_1.মাস # মাসের জন্য ---- = তারিখ_1। দিন # দিনের জন্য--
এডউইন টরেস

7

আপনিই প্রথম সঙ্গে আপনার তারিখ স্ট্রিং রূপান্তর করতে পারেন pandas.to_datetime , যা আপনি সব অ্যাক্সেস দেয় numpy DATETIME এবং timedelta সুবিধা। উদাহরণ স্বরূপ:

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

এটি আমার জন্য সত্যই ভাল কাজ করেছে, যেহেতু আমি পাইপবার্কের সাথে সাদৃশ্য কার্যকারিতা খুঁজছিলাম truncastype('datetime64[M]')সম্মেলনের কোনও দলিল আছে কি ?
এইচ 1-দ্য-সোয়ান

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')

ধাপ ২

DatetimeIndex()পদ্ধতিটি ব্যবহার করে বছর বা মাসটি বের করুন

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

1

একক লাইন: 'বছরের-মাস'-পাইরেস সহ একটি কলাম যুক্ত করা: ('পিডি টু_ডেটটাইম' প্রথমে কলামটির টাইপটি অপারেশনের আগে তারিখ-সময় পরিবর্তন করে)

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