Bagaimana cara mengubah data harian menjadi data mingguan di excel?

Pada artikel ini saya akan menunjukkan 4 metode berbeda untuk mengonversi data harian menjadi mingguan di Pandas dan membandingkan kinerjanya

Gambar oleh penulis

Tantangan

Baru-baru ini, di salah satu kelas pascasarjana saya, saya diminta untuk mengevaluasi kasus harian Covid-19 di berbagai negara di Amerika Serikat selama setahun terakhir menggunakan Pandas dan Jupyter Notebook. Tantangannya adalah menyajikan temuan sebagai data mingguan, bukan harian. Sebagai pemula dalam menggunakan Pandas, tugas sederhana ini awalnya menakutkan bagi saya, tetapi dalam proses menyelesaikan tugas ini saya telah mengembangkan 4 metode berbeda untuk mengonversi data harian menjadi data mingguan

File csv yang digunakan dalam artikel ini tersedia untuk umum di usafacts. halaman web org

import os
import numpy as np
import pandas as pd
import time

cases = pd.read_csv('covid_confirmed_usafacts.csv')

Pertama, mari siapkan file cvs untuk dikerjakan

  • Untuk kesederhanaan keluaran, kami hanya akan berkonsentrasi pada jumlah total kasus di empat negara bagian. CA, ATAU, WA dan NV. Oleh karena itu, kolom identifikasi kabupaten dan negara bagian yang tidak diperlukan dapat dihapus
  • Minggu dalam evaluasi kami akan dimulai pada hari Senin dan berakhir pada hari Minggu. Dengan demikian, kolom untuk tanggal yang sesuai dengan minggu tidak lengkap di awal/akhir rentang tanggal, juga dapat dihapus. Untuk publikasi ini file data yang digunakan berisi data dari 22/01/2020 hingga 07/02/2021
  • Data dalam file csv asli adalah total kasus Covid-19 dan perlu diubah menjadi kasus baru. Ini dilakukan dengan menggunakan sum() diikuti oleh fungsi diff() yang diterapkan pada kerangka data yang dikelompokkan berdasarkan Negara Bagian
  • Terakhir, 26/01/2020 adalah hari Minggu tepat sebelum Senin pertama dalam kerangka data dan bagian dari minggu yang tidak lengkap. Itu harus dibatalkan hanya setelah jumlah kasus baru dihitung sehingga data kasus baru tidak hilang untuk hari Senin pertama
cases_states = cases.query("State == 'CA' | State == 'OR' | State == 
'WA' | State == 'NV'")
cases_states_filtered = cases_states.drop(columns = ['countyFIPS',
'StateFIPS','County Name',
'2020-01-22','2020-01-23', '2020-01-24',
'2020-01-25'])
cases_states_daily_total = cases_states_filtered.groupby('State').sum()
new_cases_daily_total = cases_states_daily_total.diff(axis = 1)
new_cases_daily_total = new_cases_daily_total.drop(columns =
['2020-01-26'])
display(new_cases_daily_total)
_

png

Metode 1. menggunakan Python for-loop

Seperti yang telah saya pelajari sekarang, menggunakan for-loop Python untuk mengulangi data di Pandas bukanlah cara yang paling efisien untuk mengubah data harian menjadi mingguan. Hanya mengulang dengan Python for-loop tidak memanfaatkan fungsi bawaan yang ditawarkan Pandas dan ini adalah cara paling lambat untuk menyelesaikan tugas yang ada. Namun, di awal perjalanan for-loop ini tampaknya merupakan cara termudah untuk mengonversi kolom data harian menjadi mingguan, jadi saya mulai dengan mengimplementasikan fungsi yang melakukan itu

Fungsi new_case_count() mengambil objek DataFrame, mengulanginya dan mengonversi indeks, yang merupakan tanggal dalam format string, ke format Pandas Datetime. Berdasarkan tanggal hari dalam seminggu, jumlah kasus baru setiap minggu dihitung dan disimpan dalam daftar. Fungsi mengembalikan daftar jumlah kasus baru mingguan untuk setiap negara bagian

Untuk penyederhanaan, output untuk metode ini dan lainnya hanya menampilkan data 5 minggu terakhir

def new_case_count(state_new_cases):
first_Monday_found = False
week_case_count = 0
week_case_counts = []
for index, value in state_new_cases.items():
index_date = pd.to_datetime(index, format='%Y/%m/%d',
exact = False)
index_day_of_week = index_date.day_name()
if not first_Monday_found and index_day_of_week != 'Monday':
continue
first_Monday_found = True
week_case_count += value
if index_day_of_week == 'Sunday':
week_case_counts.append(week_case_count)
week_case_count = 0
return week_case_counts

# converting list to DataFrame object
new_cases_weekly_total_method_1 =
pd.DataFrame(new_case_count(new_cases_daily_total))
display(new_cases_weekly_total_method_1.tail(5))

png

Metode 2. pelabelan ulang dan groupby()

Upaya saya berikutnya untuk mengonversi data harian menjadi mingguan tidak melibatkan for-loop apa pun. Namun, itu masih merupakan metode paling lambat kedua dari keempatnya

Fungsi rename_columns_dates() mengambil objek Seri dan mengonversi indeks, yang merupakan tanggal dalam format string, ke format Pandas Datetime. Tanggal diberi label ulang dengan tanggal untuk hari Senin minggu ini dalam format '%Y/%m/%d' diikuti oleh pembatas (tanda %) dan sejumlah hari di mana tanggal saat ini diimbangi dari hari Senin minggu ini. Fungsi mengembalikan string yang mewakili pelabelan tanggal baru. Misalnya, untuk hari Senin 25/01/2021 string yang dikembalikan adalah '2021/01/25%0', untuk hari Selasa 26/01/2021 string yang dikembalikan adalah '2021/01/25%1', dan seterusnya

Selanjutnya, kasus baru dikelompokkan setiap minggu dengan memisahkan label data pada pembatas (%) dan menjumlahkan nilai untuk grup yang memiliki hari Senin yang sama dengan tanggalnya.

def rename_columns_dates(new_cases_index):
index_date = pd.to_datetime(new_cases_index, format='%Y/%m/%d',
exact = False)
index_day_of_week = index_date.day_name()
offset_from_monday = 0
if index_day_of_week == 'Tuesday':
offset_from_monday = 1
elif index_day_of_week == 'Wednesday':
offset_from_monday = 2
elif index_day_of_week == 'Thursday':
offset_from_monday = 3
elif index_day_of_week =='Friday':
offset_from_monday = 4
elif index_day_of_week == 'Saturday':
offset_from_monday = 5
elif index_day_of_week == 'Sunday':
offset_from_monday = 6

# new_date is a class of Pandas.Timeframe
new_date = index_date - pd.Timedelta(days = offset_from_monday)
return (new_date.strftime('%Y/%m/%d') + '%' +
str(offset_from_monday))

new_cases_weekly_total = new_cases_daily_total.rename(rename_columns_dates, axis = 'columns')

# grouping new cases weekly by splitting data labels at delimiter (%) and summing the values for the same Monday
new_cases_weekly_total_method_2 = new_cases_weekly_total.groupby(new_cases_weekly_total.columns.str.sp
lit('%').str[0], axis=1).sum()
display(new_cases_weekly_total_method_2.T.tail(5))

png

Metode 3. contoh ulang()

Metode ini menggunakan fungsi resample(). Saya menemukan beberapa artikel di Medium di sini dan di sini tentang cara mengonversi data harian menjadi mingguan dengan resample(). Setelah membuat beberapa perubahan pada kerangka data, saya mengaktifkan dan menjalankan metode ini

Ini adalah yang tercepat kedua dari empat seperti yang ditunjukkan di akhir artikel ini

new_cases_daily_total_modified = new_cases_daily_total.T.reset_index()

new_cases_daily_total_modified =
new_cases_daily_total_modified.assign(Weeks = new_cases_daily_total_modified['index']).drop(columns = 'index')

new_cases_daily_total_modified['Weeks'] =
new_cases_daily_total_modified['Weeks'].astype('datetime64[ns]')

new_cases_weekly_total_method_3 = new_cases_daily_total_modified.resample('W-Mon', label='left', closed = 'left', on='Weeks').sum()
display(new_cases_weekly_total_method_3.tail(5))
_

png

Metode 4. berkelompok()

Ide untuk metode ini datang kepada saya setelah membaca saran tentang stackoverflow. Saya senang Anda dapat mengelompokkan kolom sebanyak 7 sekaligus hanya dalam satu baris. Namun, kesederhanaan ini harus dibayar dengan kehilangan label tanggal Anda dan alih-alih menggunakan angka sebagai indeks, 0–53 dalam kasus ini

Untuk memperbaikinya saya mendapatkan ide untuk membuat rentang tanggal yang diperlukan dengan menggunakan pd. period_range(), mengubah rentang tanggal menjadi Seri dan menambahkannya ke DataFrame yang sekarang memiliki data mingguan. Fungsi period_range() mengembalikan PeriodIndex frekuensi tetap. Periode tanggal dalam format ini terlihat seperti ini. 'Tanggal Senin/Tanggal Minggu'. Anda dapat menyimpannya apa adanya atau membagi string pada pembatas ('/') agar tanggal Senin menandai awal minggu

Metode ini ternyata merupakan metode tercepat di antara empat metode yang diuji

new_cases_groupby_total_method_4 = new_cases_daily_total.groupby([[i//7 for i in range(0,378)]], 
axis = 1).sum().T

date_range = pd.period_range(start = '2020-01-27', end =
'2021-02-07', freq = 'W-SUN')
date_range = date_range.map(str)
date_range = date_range.str.split('/').str[0]

date_range = pd.Series(date_range)

new_cases_weekly_total_method_4 =
new_cases_groupby_total_method_4.assign(Weeks = date_range)
print('DataFrame after groupby():')
display(new_cases_groupby_total_method_4.tail(5))

print('date_range Series:')
display(date_range.tail(5))

print('Final Dataframe:')
display(new_cases_weekly_total_method_4.set_index(['Weeks']).tail(5))

png

DataFrame after groupby()
date_range Series:

49 2021-01-04
50 2021-01-11
51 2021-01-18
52 2021-01-25
53 2021-02-01
dtype: object

png

cases_states = cases.query("State == 'CA' | State == 'OR' | State == 
'WA' | State == 'NV'")
cases_states_filtered = cases_states.drop(columns = ['countyFIPS',
'StateFIPS','County Name',
'2020-01-22','2020-01-23', '2020-01-24',
'2020-01-25'])
cases_states_daily_total = cases_states_filtered.groupby('State').sum()
new_cases_daily_total = cases_states_daily_total.diff(axis = 1)
new_cases_daily_total = new_cases_daily_total.drop(columns =
['2020-01-26'])
display(new_cases_daily_total)
_0

Evaluasi kinerja

Waktu eksekusi setiap metode diukur. Saya menggunakan %%timeit untuk mengukur waktu eksekusi di Notebook Jupyter dengan menempatkan %%timeit di bagian atas setiap sel metode. Untuk membandingkan kinerja keempat metode ini, saya telah menjalankannya di Jupyter Notebook 10 kali berturut-turut

Penting untuk diingat bahwa ukuran sampel dari 10 proses sangat kecil dan ini hanya sekilas tentang performa metode

Bagaimana cara mengubah hari menjadi minggu di Excel?

ROUNDDOWN(A2/7,1) . Di bagian pertama rumus ini, nilai di sel A2 dibagi 7 dan hasilnya dibulatkan ke bawah hingga satu desimal. IF(ROUNDDOWN(A2/7,1)=1, ”minggu”, ”minggu”).

Bagaimana cara membuat jadwal mingguan di Excel?

Membuat Jadwal Kerja di Excel .
Buka Excel dan mulai spreadsheet kosong baru
Pilih sel A1 hingga E2 dan klik "Gabungkan dan Pusatkan"
Ketik "Jadwal Mingguan" atau apa pun yang Anda ingin beri nama jadwal Anda di A1. E2
Pilih ukuran font Anda dan ratakan tengah
Pilih sel F1 hingga H2 dan dari dropdown "Borders", pilih semua batas

Bagaimana cara memfilter data mingguan di Excel?

Filter berbagai data .
Pilih sel mana saja dalam rentang
Pilih Data > Filter
Pilih panah tajuk kolom
Pilih Filter Teks atau Filter Angka, lalu pilih perbandingan, seperti Antara
Masukkan kriteria filter dan pilih OK

Bagaimana cara mengonversi data harian menjadi bulanan di Excel?

Untuk mengubah tanggal menjadi bulan, gunakan fungsi TEXT di excel. Ketik =TEXT(sel u kutip, “mmmm”). .
Letakkan 10 di sel kosong
Salin sel itu, seperti dengan menggunakan CTRL + C
Pilih sel yang akan ditingkatkan
Pilih Beranda… Tempel… Tempel Spesial… Tambahkan opsi item menu, lalu klik OK