ডেটটাইম মাসে গ্রুপ প্যান্ডস ডেটাফ্রেম


91

একটি সিএসভি ফাইল বিবেচনা করুন:

string,date,number
a string,2/5/11 9:16am,1.0
a string,3/5/11 10:44pm,2.0
a string,4/22/11 12:07pm,3.0
a string,4/22/11 12:10pm,4.0
a string,4/29/11 11:59am,1.0
a string,5/2/11 1:41pm,2.0
a string,5/2/11 2:02pm,3.0
a string,5/2/11 2:56pm,4.0
a string,5/2/11 3:00pm,5.0
a string,5/2/14 3:02pm,6.0
a string,5/2/14 3:18pm,7.0

আমি এটিতে পড়তে পারি এবং তারিখ কলামটি তারিখের সময় বিন্যাসে পুনরায় ফর্ম্যাট করতে পারি:

b=pd.read_csv('b.dat')
b['date']=pd.to_datetime(b['date'],format='%m/%d/%y %I:%M%p')

আমি মাসের মধ্যে ডেটা গ্রুপ করার চেষ্টা করেছি। দেখে মনে হচ্ছে যে মাসটি অ্যাক্সেস করার এবং তার দ্বারা গ্রুপিংয়ের একটি সুস্পষ্ট উপায় থাকা উচিত। তবে আমি এটা করবো বলে মনে হচ্ছে না। কেউ জানেন কীভাবে?

আমি বর্তমানে যা চেষ্টা করছি তা তারিখ অনুসারে পুনরায় সূচীকরণ করা হচ্ছে:

b.index=b['date']

আমি এইভাবে মাসে অ্যাক্সেস করতে পারি:

b.index.month

তবে আমি একসাথে একমুঠো ফাংশন খুঁজে পেতে পারি না বলে মনে হচ্ছে can't

উত্তর:


175

এটি করতে পরিচালিত:

b = pd.read_csv('b.dat')
b.index = pd.to_datetime(b['date'],format='%m/%d/%y %I:%M%p')
b.groupby(by=[b.index.month, b.index.year])

বা

b.groupby(pd.Grouper(freq='M'))  # update for v0.21+

52
আমি মনে করি যে আরও প্যাণ্ডোনিক উপায়গুলি হ'ল হয় resample(যখন এটি আপনার প্রয়োজনীয় কার্যকারিতা সরবরাহ করে) বা ব্যবহার করুন TimeGrouper:df.groupby(pd.TimeGrouper(freq='M'))
কার্ল ডি

10
ফলাফল ডেটা ফ্রেমের যোগফল বা গড় পেতে, df.groupby(pd.TimeGrouper(freq='M')).sum()বাdf.groupby(pd.TimeGrouper(freq='M')).mean()
আলেকজান্দ্রে

9
pd.TimeGrouperএর পক্ষে অবমূল্যায়ন করা হয়েছে pd.Grouperযা কিছুটা নমনীয় তবে তবুও লাগে freqএবং levelতর্ক করে।
বলপয়েন্টবেন

প্রথম পদ্ধতিটি কাজ করে না। এটা তোলে ত্রুটি দেয়, মাস '' এর জন্য একটি সিরিজ মাধ্যমে তৈরি করা 'সিরিজ বস্তুর কোন অ্যাট্রিবিউট আছে' to_datetime
ely

4
@ely উত্তরটি মূল প্রশ্নের উত্তরগুলিতে স্পষ্টভাবে নির্ভর করে যেখানে bসিএসভি থেকে পড়ার পরে সূচি দেওয়া হয়। যোগ b.index = pd.to_datetime(b['date'],format='%m/%d/%y %I:%M%p')লাইন পর b = pd.read_csv('b.dat')। [আমি এখনই উত্তরটি সম্পাদনা করেছি]]
মালাইসাইড

72

(আপডেট: 2018)

নোট যে pd.Timegrouperঅবচয় হয় এবং সরানো হবে। পরিবর্তে ব্যবহার করুন:

 df.groupby(pd.Grouper(freq='M'))

4
এখানে গ্রুপিং ডক্স এবং ফ্রিকোয়েন্সি স্পেসিফিকেশন ( freq=...) এখানে সন্ধান করুন । কিছু উদাহরণ freq=Dজন্য দিন , freq=Bজন্য কর্মদিবসের , freq=Wজন্য সপ্তাহ বা এমনকি freq=Qজন্য আবাস
কিম

4
ডিএফের পুনরায় সূচি না এড়াতে 'কী' ব্যবহার করা আমার পক্ষে দরকারী বলে মনে হয়েছে: df.groupby (pd.Grouper (key = 'your_date_column', freq = 'M'))
এডওয়ার্ড

10

একটি সমাধান যা মাল্টিআইএনডেক্স এড়ায় তা হ'ল একটি নতুন datetimeকলাম সেটিং দিন = ১ তৈরি করা Then তারপরে এই কলামটি অনুসারে গ্রুপ করুন। তুচ্ছ উদাহরণ নীচে।

df = pd.DataFrame({'Date': pd.to_datetime(['2017-10-05', '2017-10-20']),
                   'Values': [5, 10]})

# normalize day to beginning of month
df['YearMonth'] = df['Date'] - pd.offsets.MonthBegin(1)

# two alternative methods
df['YearMonth'] = df['Date'] - pd.to_timedelta(df['Date'].dt.day-1, unit='D')
df['YearMonth'] = df['Date'].map(lambda dt: dt.replace(day=1))

g = df.groupby('YearMonth')

res = g['Values'].sum()

# YearMonth
# 2017-10-01    15
# Name: Values, dtype: int64

এই সমাধানটির সূক্ষ্ম সুবিধাটি হ'ল pd.Grouperবিপরীতভাবে, গ্রুপার সূচকটি প্রতিটি মাসের শুরুতে শেষের পরিবর্তে স্বাভাবিক করা হয় এবং তাই আপনি সহজেই এর মাধ্যমে গোষ্ঠীগুলি বের করতে পারবেন get_group:

some_group = g.get_group('2017-10-01')

অক্টোবরের শেষ দিন গণনা করা কিছুটা জটিল। pd.Grouperv0.23 হিসাবে conventionপ্যারামিটার সমর্থন করে তবে এটি কেবল PeriodIndexগ্রুপারের জন্যই প্রযোজ্য ।


8

@ জেপিপি এর কিছুটা বিকল্প সমাধান তবে YearMonthস্ট্রিং আউটপুট করা :

df['YearMonth'] = pd.to_datetime(df['Date']).apply(lambda x: '{year}-{month}'.format(year=x.year, month=x.month))

res = df.groupby('YearMonth')['Values'].sum()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.