Data saya dapat memiliki beberapa acara pada tanggal tertentu atau NO acara pada tanggal tertentu. Saya mengambil peristiwa ini, menghitung berdasarkan tanggal dan memplotnya. Namun, ketika saya memplotnya, kedua seri saya tidak selalu cocok.
idx = pd.date_range(df['simpleDate'].min(), df['simpleDate'].max())
s = df.groupby(['simpleDate']).size()
Dalam kode di atas idx menjadi kisaran katakanlah 30 tanggal. 09-01-2013 hingga 09-30-2013 Namun S mungkin hanya memiliki 25 atau 26 hari karena tidak ada peristiwa yang terjadi untuk tanggal tertentu. Saya kemudian mendapatkan AssertionError karena ukurannya tidak cocok ketika saya mencoba merencanakan:
fig, ax = plt.subplots()
ax.bar(idx.to_pydatetime(), s, color='green')
Apa cara yang tepat untuk mengatasi ini? Apakah saya ingin menghapus tanggal tanpa nilai dari IDX atau (yang lebih saya lakukan) adalah menambahkan ke rangkaian tanggal yang hilang dengan hitungan 0. Saya lebih suka memiliki grafik penuh 30 hari dengan nilai 0. Jika pendekatan ini benar, ada saran tentang bagaimana memulainya? Apakah saya membutuhkan semacam dinamikareindex
fungsi ?
Berikut potongan S ( df.groupby(['simpleDate']).size()
), tidak ada entri untuk 04 dan 05.
09-02-2013 2
09-03-2013 10
09-06-2013 5
09-07-2013 1
reindex
adalah fungsi yang luar biasa. Ini dapat (1) menyusun ulang data yang ada agar sesuai dengan kumpulan label baru, (2) menyisipkan baris baru yang sebelumnya tidak ada label, (3) mengisi data untuk label yang hilang, (termasuk dengan pengisian maju / mundur) (4) pilih baris dengan label!idx = pd.date_range(df.index.min(), df.index.max())
Solusi yang lebih cepat adalah dengan menggunakan
.asfreq()
. Ini tidak memerlukan pembuatan indeks baru untuk dipanggil.reindex()
.sumber
date_range
karena secara implisit menggunakan indeks pertama dan terakhir sebagai awal dan akhir (yang hampir selalu Anda inginkan).Satu masalah adalah itu
reindex
akan gagal jika ada nilai duplikat. Katakanlah kita sedang bekerja dengan data cap waktu, yang ingin kita indeks berdasarkan tanggal:hasil
Karena
2016-11-16
tanggal duplikat , upaya untuk mengindeks ulang:gagal dengan:
(dengan ini berarti indeks memiliki duplikat, bukan duplikat itu sendiri)
Sebaliknya, kita dapat menggunakan
.loc
untuk mencari entri untuk semua tanggal dalam kisaran:hasil
fillna
dapat digunakan pada rangkaian kolom untuk mengisi kekosongan jika diperlukan.sumber
Blanks
atauNULLS
?df.loc[all_days]
tidak akan berfungsi dalam kasus itu.Pendekatan alternatif adalah
resample
, yang dapat menangani tanggal duplikat selain tanggal yang hilang. Sebagai contoh:resample
adalah operasi yang ditangguhkangroupby
sehingga Anda harus mengikutinya dengan operasi lain. Dalam hal inimean
bekerja dengan baik, tetapi Anda juga dapat menggunakan berbagai metode panda lain sepertimax
,sum
, dllBerikut adalah data asli, tetapi dengan entri tambahan untuk '2013-09-03':
Dan inilah hasilnya:
Saya meninggalkan tanggal yang hilang sebagai NaN untuk memperjelas cara kerjanya, tetapi Anda dapat menambahkan
fillna(0)
untuk mengganti NaN dengan nol seperti yang diminta oleh OP atau sebagai alternatif menggunakan sesuatu sepertiinterpolate()
mengisi dengan nilai bukan nol berdasarkan baris tetangga.sumber
Berikut adalah metode yang bagus untuk mengisi tanggal yang hilang ke dalam kerangka data, dengan pilihan Anda
fill_value
,days_back
untuk mengisi, dan mengurutkan urutan (date_order
) yang digunakan untuk mengurutkan kerangka data:sumber