Pertimbangkan file csv:
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
Saya dapat membaca ini, dan memformat ulang kolom tanggal ke dalam format tanggal waktu:
b=pd.read_csv('b.dat')
b['date']=pd.to_datetime(b['date'],format='%m/%d/%y %I:%M%p')
Saya telah mencoba mengelompokkan data berdasarkan bulan. Sepertinya harus ada cara yang jelas untuk mengakses bulan dan mengelompokkannya. Tapi sepertinya aku tidak bisa melakukannya. Apakah ada yang tahu caranya?
Apa yang saat ini saya coba adalah mengindeks ulang pada tanggal:
b.index=b['date']
Saya dapat mengakses bulan seperti ini:
b.index.month
Namun saya tidak bisa menemukan fungsi untuk disatukan berdasarkan bulan.
python
pandas
datetime
pandas-groupby
atomh33ls
sumber
sumber
resample
(bila menyediakan fungsionalitas yang Anda butuhkan) atau menggunakanTimeGrouper
:df.groupby(pd.TimeGrouper(freq='M'))
df.groupby(pd.TimeGrouper(freq='M')).sum()
ataudf.groupby(pd.TimeGrouper(freq='M')).mean()
pd.TimeGrouper
telah ditinggalkan dalam mendukungpd.Grouper
, yang sedikit lebih fleksibel tetapi masih membutuhkanfreq
danlevel
argumen.to_datetime
.b
yang diberi indeks setelah dibaca dari CSV. Tambahkanb.index = pd.to_datetime(b['date'],format='%m/%d/%y %I:%M%p')
setelah garisb = pd.read_csv('b.dat')
. [Saya baru saja mengedit jawabannya.](update: 2018)
Catatan yang
pd.Timegrouper
disusutkan dan akan dihapus. Gunakan sebagai gantinya:df.groupby(pd.Grouper(freq='M'))
sumber
freq=...
) di sini . Beberapa contohfreq=D
untuk hari ,freq=B
untuk hari kerja ,freq=W
selama berminggu - minggu atau bahkanfreq=Q
untuk kuartal .Salah satu solusi yang menghindari MultiIndex adalah membuat
datetime
kolom baru dengan pengaturan hari = 1. Kemudian kelompokkan berdasarkan kolom ini. Contoh sepele di bawah ini.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
Manfaat halus dari solusi ini adalah, tidak seperti
pd.Grouper
, indeks kerapu dinormalisasi ke awal setiap bulan, bukan di akhir, dan oleh karena itu Anda dapat dengan mudah mengekstrak grup melaluiget_group
:some_group = g.get_group('2017-10-01')
Menghitung hari terakhir bulan Oktober sedikit lebih rumit.
pd.Grouper
, mulai v0.23, memang mendukungconvention
parameter, tetapi ini hanya berlaku untukPeriodIndex
kerapu.sumber
Solusi sedikit alternatif untuk @ jpp tetapi mengeluarkan
YearMonth
string: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()
sumber