import pandas as pd, pathlib
%matplotlib inline
data_path = pathlib.Path('../testdata/bmkg/data_jawa_barat_1980_2018.xlsx')
raw_data_jabar = pd.read_excel(data_path, skiprows=6)
raw_data_jabar.head()
Nama Stasiun | WMO ID | Tanggal | Suhu Minimum (°C) | Suhu Maksimum (°C) | Suhu Rata-rata (°C) | Kelembaban Rata-rata (%) | Curah Hujan (mm) | Lama Penyinaran (jam) | Kecepatan Angin Rata-rata (knot) | Arah Angin Terbanyak (deg) | Kecepatan Angin Terbesar (knot) | Arah Angin Saat Kecepatan Maksimum (deg) | Unnamed: 13 | Keterangan | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Stasiun Meteorologi Jatiwangi | 96791 | 01/01/1980 | 22.6 | 32.2 | 25.8 | 90 | 13.9 | 3.4 | 3 | NW | 5 | 315 | NaN | * 8888 : Data Tidak Terukur |
1 | Stasiun Geofisika Bandung | 96783 | 01/01/1980 | 20.0 | 26.0 | 23.0 | 80 | 1.0 | 4.5 | 2 | W | 4 | 270 | NaN | * 9999 : Tidak Ada Data |
2 | Stasiun Meteorologi Jatiwangi | 96791 | 02/01/1980 | 21.0 | 30.2 | 25.7 | 88 | 9.4 | 1.5 | 4 | NW | 5 | 315 | NaN | NaN |
3 | Stasiun Geofisika Bandung | 96783 | 02/01/1980 | 18.8 | 27.3 | 22.8 | 80 | 8888.0 | 2.2 | 2 | W | 4 | 270 | NaN | NaN |
4 | Stasiun Meteorologi Jatiwangi | 96791 | 03/01/1980 | 21.6 | 31.2 | 26.6 | 85 | 0.0 | 3.8 | 4 | W | 5 | 270 | NaN | NaN |
data_jabar = raw_data_jabar.iloc[:,:-2]
data_jabar.head(10)
Nama Stasiun | WMO ID | Tanggal | Suhu Minimum (°C) | Suhu Maksimum (°C) | Suhu Rata-rata (°C) | Kelembaban Rata-rata (%) | Curah Hujan (mm) | Lama Penyinaran (jam) | Kecepatan Angin Rata-rata (knot) | Arah Angin Terbanyak (deg) | Kecepatan Angin Terbesar (knot) | Arah Angin Saat Kecepatan Maksimum (deg) | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Stasiun Meteorologi Jatiwangi | 96791 | 01/01/1980 | 22.6 | 32.2 | 25.8 | 90 | 13.9 | 3.4 | 3 | NW | 5 | 315 |
1 | Stasiun Geofisika Bandung | 96783 | 01/01/1980 | 20.0 | 26.0 | 23.0 | 80 | 1.0 | 4.5 | 2 | W | 4 | 270 |
2 | Stasiun Meteorologi Jatiwangi | 96791 | 02/01/1980 | 21.0 | 30.2 | 25.7 | 88 | 9.4 | 1.5 | 4 | NW | 5 | 315 |
3 | Stasiun Geofisika Bandung | 96783 | 02/01/1980 | 18.8 | 27.3 | 22.8 | 80 | 8888.0 | 2.2 | 2 | W | 4 | 270 |
4 | Stasiun Meteorologi Jatiwangi | 96791 | 03/01/1980 | 21.6 | 31.2 | 26.6 | 85 | 0.0 | 3.8 | 4 | W | 5 | 270 |
5 | Stasiun Geofisika Bandung | 96783 | 03/01/1980 | 19.1 | 27.7 | 22.7 | 80 | 8888.0 | 3.0 | 2 | W | 4 | 270 |
6 | Stasiun Meteorologi Jatiwangi | 96791 | 04/01/1980 | 22.5 | 30.6 | 26.6 | 84 | 0.0 | 0.7 | 3 | NW | 5 | 315 |
7 | Stasiun Geofisika Bandung | 96783 | 04/01/1980 | 19.9 | 26.9 | 23.3 | 82 | 1.0 | 3.1 | 2 | W | 5 | 270 |
8 | Stasiun Meteorologi Jatiwangi | 96791 | 05/01/1980 | 23.1 | 32.0 | 26.9 | 9999 | 0.0 | 4.3 | 2 | NW | 2 | 315 |
9 | Stasiun Geofisika Bandung | 96783 | 05/01/1980 | 20.6 | 28.8 | 23.8 | 80 | 8888.0 | 6.4 | 2 | W | 4 | 270 |
data_jabar.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 52376 entries, 0 to 52375 Data columns (total 13 columns): Nama Stasiun 52376 non-null object WMO ID 52376 non-null int64 Tanggal 52376 non-null object Suhu Minimum (°C) 52376 non-null float64 Suhu Maksimum (°C) 52376 non-null float64 Suhu Rata-rata (°C) 52376 non-null float64 Kelembaban Rata-rata (%) 52376 non-null int64 Curah Hujan (mm) 52376 non-null float64 Lama Penyinaran (jam) 52376 non-null float64 Kecepatan Angin Rata-rata (knot) 52376 non-null int64 Arah Angin Terbanyak (deg) 52376 non-null object Kecepatan Angin Terbesar (knot) 52376 non-null int64 Arah Angin Saat Kecepatan Maksimum (deg) 52376 non-null int64 dtypes: float64(5), int64(5), object(3) memory usage: 5.2+ MB
nama_kolom_asli = data_jabar.columns.tolist()
nama_kolom_asli
['Nama Stasiun ', 'WMO ID', 'Tanggal', 'Suhu Minimum (°C)', 'Suhu Maksimum (°C)', 'Suhu Rata-rata (°C)', 'Kelembaban Rata-rata (%)', 'Curah Hujan (mm)', 'Lama Penyinaran (jam)', 'Kecepatan Angin Rata-rata (knot)', 'Arah Angin Terbanyak (deg)', 'Kecepatan Angin Terbesar (knot)', 'Arah Angin Saat Kecepatan Maksimum (deg)']
nama_baru = [
'name_stat', 'id_stat', 'date', 'suhu_min', 'suhu_max', 'suhu_mean',
'lembab_mean', 'curah_hujan', 'lama_sinar', 'cepat_angin_mean',
'arah_angin_mode', 'cepat_angin_max', 'arah_cepat_angin_max'
]
# Simpan informasi satuan
satuan_kolom = dict(suhu_min='Celcius', suhu_max='Celcius', suhu_mean='Celcius',
lembab_mean='%', curah_hujan='mm', lama_sinar='jam', cepat_angin_mean='knot',
arah_angin_mode='deg', cepat_angin_max='knot', arah_cepat_angin_max='deg')
data_jabar.columns = nama_baru
data_jabar.head()
name_stat | id_stat | date | suhu_min | suhu_max | suhu_mean | lembab_mean | curah_hujan | lama_sinar | cepat_angin_mean | arah_angin_mode | cepat_angin_max | arah_cepat_angin_max | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Stasiun Meteorologi Jatiwangi | 96791 | 01/01/1980 | 22.6 | 32.2 | 25.8 | 90 | 13.9 | 3.4 | 3 | NW | 5 | 315 |
1 | Stasiun Geofisika Bandung | 96783 | 01/01/1980 | 20.0 | 26.0 | 23.0 | 80 | 1.0 | 4.5 | 2 | W | 4 | 270 |
2 | Stasiun Meteorologi Jatiwangi | 96791 | 02/01/1980 | 21.0 | 30.2 | 25.7 | 88 | 9.4 | 1.5 | 4 | NW | 5 | 315 |
3 | Stasiun Geofisika Bandung | 96783 | 02/01/1980 | 18.8 | 27.3 | 22.8 | 80 | 8888.0 | 2.2 | 2 | W | 4 | 270 |
4 | Stasiun Meteorologi Jatiwangi | 96791 | 03/01/1980 | 21.6 | 31.2 | 26.6 | 85 | 0.0 | 3.8 | 4 | W | 5 | 270 |
data_jabar.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 52376 entries, 0 to 52375 Data columns (total 13 columns): name_stat 52376 non-null object id_stat 52376 non-null int64 date 52376 non-null object suhu_min 52376 non-null float64 suhu_max 52376 non-null float64 suhu_mean 52376 non-null float64 lembab_mean 52376 non-null int64 curah_hujan 52376 non-null float64 lama_sinar 52376 non-null float64 cepat_angin_mean 52376 non-null int64 arah_angin_mode 52376 non-null object cepat_angin_max 52376 non-null int64 arah_cepat_angin_max 52376 non-null int64 dtypes: float64(5), int64(5), object(3) memory usage: 5.2+ MB
id_stat
diubah menjadi object
; date
jadi TimeStamp
;
data_jabar.id_stat = data_jabar.id_stat.apply(str)
data_jabar.date = pd.to_datetime(data_jabar.date, format='%d/%m/%Y')
# cek jumlah stasiun
data_jabar = data_jabar.sort_values(['id_stat','date']).reset_index(drop=True)
data_jabar.head()
name_stat | id_stat | date | suhu_min | suhu_max | suhu_mean | lembab_mean | curah_hujan | lama_sinar | cepat_angin_mean | arah_angin_mode | cepat_angin_max | arah_cepat_angin_max | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Stasiun Meteorologi Citeko | 96751 | 1985-01-01 | 18.1 | 24.7 | 20.3 | 90 | 9.0 | 9999.0 | 9999 | 9999 | 9999 | 9999 |
1 | Stasiun Meteorologi Citeko | 96751 | 1985-01-02 | 18.0 | 24.1 | 20.7 | 88 | 11.0 | 9999.0 | 9999 | 9999 | 9999 | 9999 |
2 | Stasiun Meteorologi Citeko | 96751 | 1985-01-03 | 17.6 | 25.5 | 21.0 | 86 | 7.0 | 9999.0 | 9999 | 9999 | 9999 | 9999 |
3 | Stasiun Meteorologi Citeko | 96751 | 1985-01-04 | 17.8 | 25.6 | 21.7 | 88 | 7.0 | 9999.0 | 9999 | 9999 | 9999 | 9999 |
4 | Stasiun Meteorologi Citeko | 96751 | 1985-01-05 | 17.5 | 23.7 | 21.0 | 87 | 13.0 | 9999.0 | 9999 | 9999 | 9999 | 9999 |
# Cek jumlah stasiun yang ada berdasarkan id_stat
data_jabar.id_stat.unique()
array(['96751', '96753', '96783', '96791', '96793'], dtype=object)
# Ada 5 stasiun, lihat juga jumlah data yang dimiliki
data_jabar.groupby('id_stat').count()
name_stat | date | suhu_min | suhu_max | suhu_mean | lembab_mean | curah_hujan | lama_sinar | cepat_angin_mean | arah_angin_mode | cepat_angin_max | arah_cepat_angin_max | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
id_stat | ||||||||||||
96751 | 11934 | 11934 | 11934 | 11934 | 11934 | 11934 | 11934 | 11934 | 11934 | 11934 | 11934 | 11934 |
96753 | 12330 | 12330 | 12330 | 12330 | 12330 | 12330 | 12330 | 12330 | 12330 | 12330 | 12330 | 12330 |
96783 | 13817 | 13817 | 13817 | 13817 | 13817 | 13817 | 13817 | 13817 | 13817 | 13817 | 13817 | 13817 |
96791 | 13807 | 13807 | 13807 | 13807 | 13807 | 13807 | 13807 | 13807 | 13807 | 13807 | 13807 | 13807 |
96793 | 488 | 488 | 488 | 488 | 488 | 488 | 488 | 488 | 488 | 488 | 488 | 488 |
# buat dictionary id dan nama stasiun (hal ini bisa menggunakan database dalam metadata_station)
info_stat_jabar = dict()
for i, j in zip(data_jabar.id_stat.unique().tolist(), data_jabar.name_stat.unique().tolist()):
info_stat_jabar[i] = j
info_stat_jabar
{'96751': 'Stasiun Meteorologi Citeko', '96753': 'Stasiun Klimatologi Bogor', '96783': 'Stasiun Geofisika Bandung', '96791': 'Stasiun Meteorologi Jatiwangi', '96793': 'Pos Meteorologi Penggung'}
Diketahui bahwa untuk
11934
hari12330
hari13817
hari13807
hari488
haricatatan: angka tersebut masih memiliki nilai 9999
dan 8888
stat_citeko = data_jabar[data_jabar.id_stat == '96751'].drop(['name_stat', 'id_stat'], axis=1).copy()
stat_citeko = stat_citeko.set_index('date')
stat_citeko.head()
suhu_min | suhu_max | suhu_mean | lembab_mean | curah_hujan | lama_sinar | cepat_angin_mean | arah_angin_mode | cepat_angin_max | arah_cepat_angin_max | |
---|---|---|---|---|---|---|---|---|---|---|
date | ||||||||||
1985-01-01 | 18.1 | 24.7 | 20.3 | 90 | 9.0 | 9999.0 | 9999 | 9999 | 9999 | 9999 |
1985-01-02 | 18.0 | 24.1 | 20.7 | 88 | 11.0 | 9999.0 | 9999 | 9999 | 9999 | 9999 |
1985-01-03 | 17.6 | 25.5 | 21.0 | 86 | 7.0 | 9999.0 | 9999 | 9999 | 9999 | 9999 |
1985-01-04 | 17.8 | 25.6 | 21.7 | 88 | 7.0 | 9999.0 | 9999 | 9999 | 9999 | 9999 |
1985-01-05 | 17.5 | 23.7 | 21.0 | 87 | 13.0 | 9999.0 | 9999 | 9999 | 9999 | 9999 |
# Hitung jumlah data curah hujan yang memiliki nilai 9999 dan 8888
stat_citeko_ch = stat_citeko.curah_hujan
mask = (stat_citeko_ch == 9999) | (stat_citeko_ch == 8888)
mask.sum()
401
# Pada tanggal berapa saja datanya memiliki nilai 8888 atau 9999
mask.index
DatetimeIndex(['1985-01-01', '1985-01-02', '1985-01-03', '1985-01-04', '1985-01-05', '1985-01-06', '1985-01-07', '1985-01-08', '1985-01-09', '1985-01-10', ... '2017-12-23', '2017-12-24', '2017-12-25', '2017-12-26', '2017-12-27', '2017-12-28', '2017-12-29', '2017-12-30', '2017-12-31', '2018-01-01'], dtype='datetime64[ns]', name='date', length=11934, freq=None)
# Coba plot curah hujan dengan mengabaikan nilai 8888/9999 pada durasi tertentu
stat_citeko_ch[~mask].plot(figsize=(15,10))
<matplotlib.axes._subplots.AxesSubplot at 0x1ed0ebc46a0>
# Periode tertentu
ch_citeko_00_05 = stat_citeko_ch[~mask].loc['20000101':'20051231']
ch_citeko_00_05.plot(figsize=(15,10))
<matplotlib.axes._subplots.AxesSubplot at 0x1ed10355cf8>
ch_citeko_00_05.plot.hist(figsize=(15,10), bins=50)
<matplotlib.axes._subplots.AxesSubplot at 0x1ed10e2f588>
stat_citeko_ch[~mask & (stat_citeko_ch > 0)].plot.hist(figsize=(15,10), bins=50)
<matplotlib.axes._subplots.AxesSubplot at 0x1ed10eb6518>