Saya memiliki Dataframe, df, dengan kolom berikut:
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
...
Elemen-elemen kolom adalah pandas.tslib.Timestamp.
Saya hanya ingin memasukkan tahun dan bulan. Saya pikir akan ada cara sederhana untuk melakukannya, tetapi saya tidak bisa mengetahuinya.
Inilah yang saya coba:
df['ArrivalDate'].resample('M', how = 'mean')
Saya mendapat kesalahan berikut:
Only valid with DatetimeIndex or PeriodIndex
Kemudian saya mencoba:
df['ArrivalDate'].apply(lambda(x):x[:-2])
Saya mendapat kesalahan berikut:
'Timestamp' object has no attribute '__getitem__'
Ada saran?
Sunting: Saya menemukan jawabannya.
df.index = df['ArrivalDate']
Lalu, saya bisa melakukan sampel ulang kolom lain menggunakan indeks.
Tapi saya masih ingin metode untuk mengkonfigurasi ulang seluruh kolom. Ada ide?
to_period
:df.date_column.dt.month
(atau.year
, atau.day
) bekerja.dt.month
kalah tahun ini. Dan.dt.to_period('M')
mengubah tipe data menjadi sesuatu yang bukan datetime64 lagi. Saya akhirnya menggunakan jawaban Juan menyarankan.astype('datetime64[M]')
untuk memotong nilai-nilai.Jawaban:
Jika Anda ingin kolom baru menampilkan tahun dan bulan secara terpisah, Anda dapat melakukan ini:
atau...
Kemudian Anda dapat menggabungkan mereka atau bekerja dengan mereka sebagaimana adanya.
sumber
timeit
menunjukkan bahwaDatetimeIndex
pendekatan secara signifikan lebih cepat daripada salah satu.map/.apply
atau.dt
.df['date_column_trunc'] = df[date_column'].apply(lambda s: datetime.date(s.year, s.month, 1)
Cara terbaik ditemukan !!
yang
df['date_column']
harus di tanggal format waktu.Anda juga dapat menggunakan
D
untuk Hari,2M
selama 2 Bulan dll untuk interval pengambilan sampel yang berbeda, dan jika seseorang memiliki data deret waktu dengan cap waktu, kita dapat menggunakan interval pengambilan sampel granular seperti45Min
selama 45 menit,15Min
untuk pengambilan sampel 15 menit dll.sumber
datetime64
lagi. Menggunakandf.my_date_column.astype('datetime64[M]')
, seperti pada jawaban @ Juan dikonversi ke tanggal yang mewakili hari pertama setiap bulan.Anda dapat langsung mengakses atribut
year
danmonth
, atau memintadatetime.datetime
:Satu cara untuk menggabungkan tahun dan bulan adalah dengan membuat bilangan bulat yang menyandikannya, seperti:
201408
untuk Agustus 2014. Di sepanjang kolom, Anda bisa melakukan ini sebagai:atau banyak varian daripadanya.
Saya bukan penggemar berat melakukan ini, karena hal itu membuat penyelarasan tanggal dan aritmatika menyakitkan kemudian dan terutama menyakitkan bagi orang lain yang menemukan kode atau data Anda tanpa konvensi yang sama ini. Cara yang lebih baik adalah memilih konvensi hari-bulan, seperti hari kerja akhir non-AS-liburan, atau hari pertama, dll., Dan meninggalkan data dalam format tanggal / waktu dengan konvensi tanggal yang dipilih.
The
calendar
Modul ini berguna untuk memperoleh nilai jumlah hari tertentu seperti hari kerja akhir. Maka Anda dapat melakukan sesuatu seperti:Jika Anda sedang mencari cara untuk memecahkan masalah yang lebih sederhana dengan hanya memformat kolom datetime menjadi beberapa representasi yang dirangkai, untuk itu Anda bisa memanfaatkan
strftime
fungsi daridatetime.datetime
kelas, seperti ini:sumber
pandas
teknik split-apply-menggabungkan. Saran saya di atas tidak dimaksudkan untuk dianggap sebagai dukungan bahwa mereka adalah pendekatan yang paling berkinerja untuk kasus Anda - hanya saja itu adalah pilihan Pythonic yang valid secara gaya untuk berbagai kasus.df['YearMonth'] = df['ArrivalDate'].map(lambda x: 1000*x.year + x.month)
.Jika Anda ingin pasangan unik tahun bulan, menggunakan berlaku cukup ramping.
Output bulan-tahun dalam satu kolom.
Jangan lupa untuk terlebih dahulu mengubah format tanggal-waktu sebelumnya, saya biasanya lupa.
sumber
df['month_year'] = df['date_column'].dt.strftime('%B-%Y')
Mengekstraksi Tahun, katakan dari ['2018-03-04']
Df ['Tahun'] membuat kolom baru. Sementara jika Anda ingin mengekstrak bulan cukup gunakan. Bulan
sumber
Pertama-tama Anda dapat mengonversi string tanggal Anda dengan panda.to_datetime , yang memberi Anda akses ke semua datetime yang numpy dan fasilitas timedelta . Sebagai contoh:
sumber
trunc
. Apakah ada dokumentasi untukastype('datetime64[M]')
konvensi?Berkat jaknap32 , saya ingin menggabungkan hasil menurut Tahun dan Bulan, jadi ini berhasil:
Outputnya rapi:
sumber
Solusi @ KieranPC adalah pendekatan yang tepat untuk Pandas, tetapi tidak mudah diperluas untuk atribut yang berubah-ubah. Untuk ini, Anda dapat menggunakan
getattr
dalam pemahaman generator dan menggabungkan menggunakanpd.concat
:sumber
Ini bekerja dengan baik untuk saya, tidak berpikir panda akan menafsirkan tanggal string yang dihasilkan sebagai tanggal, tetapi ketika saya melakukan plot, ia tahu betul agenda saya dan tahun_month string mana dipesan dengan benar ... panda cinta harus!
sumber
Ada dua langkah untuk mengekstrak tahun untuk semua kerangka data tanpa menggunakan metode yang berlaku.
Langkah 1
ubah kolom menjadi datetime:
Langkah 2
ekstrak tahun atau bulan menggunakan
DatetimeIndex()
metodesumber
SINGLE LINE: Menambahkan kolom dengan 'tahun-bulan'-pasangan: ('pd.to_datetime' pertama mengubah dtype kolom ke tanggal-waktu sebelum operasi)
Maka untuk kolom 'tahun' atau 'bulan' tambahan:
sumber