In [1]:
import pandas as pd, pathlib
%matplotlib inline
In [2]:
data_path = pathlib.Path('../testdata/bmkg/data_jawa_barat_1980_2018.xlsx')
In [3]:
raw_data_jabar = pd.read_excel(data_path, skiprows=6)
raw_data_jabar.head()
Out[3]:
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
In [4]:
data_jabar = raw_data_jabar.iloc[:,:-2]
data_jabar.head(10)
Out[4]:
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
In [5]:
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

Ubah nama kolom, untuk lebih mudah digunakan

In [6]:
nama_kolom_asli = data_jabar.columns.tolist()
nama_kolom_asli
Out[6]:
['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)']
In [7]:
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')
In [8]:
data_jabar.columns = nama_baru
In [9]:
data_jabar.head()
Out[9]:
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

Ubah tipe data

In [10]:
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;

In [11]:
data_jabar.id_stat = data_jabar.id_stat.apply(str)
data_jabar.date = pd.to_datetime(data_jabar.date, format='%d/%m/%Y')

Ambil data Per stasiun

In [12]:
# cek jumlah stasiun
data_jabar = data_jabar.sort_values(['id_stat','date']).reset_index(drop=True)
In [13]:
data_jabar.head()
Out[13]:
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
In [14]:
# Cek jumlah stasiun yang ada berdasarkan id_stat
data_jabar.id_stat.unique()
Out[14]:
array(['96751', '96753', '96783', '96791', '96793'], dtype=object)
In [15]:
# Ada 5 stasiun, lihat juga jumlah data yang dimiliki
data_jabar.groupby('id_stat').count()
Out[15]:
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
In [16]:
# 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
Out[16]:
{'96751': 'Stasiun Meteorologi Citeko',
 '96753': 'Stasiun Klimatologi Bogor',
 '96783': 'Stasiun Geofisika Bandung',
 '96791': 'Stasiun Meteorologi Jatiwangi',
 '96793': 'Pos Meteorologi Penggung'}

Diketahui bahwa untuk

  • 96751: Stasiun Meteorologi Citeko - 11934 hari
  • 96753: Stasiun Klimatologi Bogor - 12330 hari
  • 96783: Stasiun Geofisika Bandung - 13817 hari
  • 96791: Stasiun Meteorologi Jatiwangi - 13807 hari
  • 96793: Pos Meteorologi Penggung - 488 hari

catatan: angka tersebut masih memiliki nilai 9999 dan 8888

In [17]:
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()
Out[17]:
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
In [18]:
# 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()
Out[18]:
401
In [19]:
# Pada tanggal berapa saja datanya memiliki nilai 8888 atau 9999
mask.index
Out[19]:
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)
In [20]:
# Coba plot curah hujan dengan mengabaikan nilai 8888/9999 pada durasi tertentu
stat_citeko_ch[~mask].plot(figsize=(15,10))
Out[20]:
<matplotlib.axes._subplots.AxesSubplot at 0x1ed0ebc46a0>
In [21]:
# Periode tertentu
ch_citeko_00_05 = stat_citeko_ch[~mask].loc['20000101':'20051231']
ch_citeko_00_05.plot(figsize=(15,10))
Out[21]:
<matplotlib.axes._subplots.AxesSubplot at 0x1ed10355cf8>
In [22]:
ch_citeko_00_05.plot.hist(figsize=(15,10), bins=50)
Out[22]:
<matplotlib.axes._subplots.AxesSubplot at 0x1ed10e2f588>
In [23]:
stat_citeko_ch[~mask & (stat_citeko_ch > 0)].plot.hist(figsize=(15,10), bins=50)
Out[23]:
<matplotlib.axes._subplots.AxesSubplot at 0x1ed10eb6518>
In [ ]:
 
In [ ]: