Home » Data analysis » Reformat Indonesian rainfall point data

Reformat Indonesian rainfall point data

Di indonesia data hujan seringkali didapatkan dalam bentuk tipikal kolom bulan dan baris tanggal, dengan sheet per data tahun. Data dengan format seperti ini sejauh yang penulis pahami cukup sulit untuk diolah secara otomatis dan membutuhkan reformatting sehingga format nya mudah untuk dilakukan analisis (misal: long format).

Contoh format panjang dapat diunduh disini:

https://drive.google.com/file/d/1xlSCWVJY3yy1HofliLGTV08IdeufkdVb/view?usp=sharing

Contoh data hujan dengan format excel tipikal seperti ini dapat diunduh di sini:

https://drive.google.com/drive/folders/1oUxKmxHcb_WtHu7RBDjpvtqvBXe_3ALo?usp=sharing

Dalam artikel ini saya akan berikan code R (R studio) untuk mengolah data tersebut menjadi format panjang hanya dengan dua kolom (kolom pertama: Tanggal, kolom kedua: besaran hujan (mm/hari)).

1. Install dan muat library

install.packages(c("tidyverse","readxl","snht")

Muat package tersebut

library(tidyverse)
library(readxl)
library(snht)

2. Membuat fungsi

Pertama-tama saya membuat function untuk kemudian bisa dipanggil kembali. Dalam R Studio, kita dapat membuat fungsi dengan menggunakan perintah function(). Penggunaan function ini sangat bermanfaat dengan tujuan:

  1. Modularitas (membagi kode menjadi bagian-bagian yang lebih kecil dan terorganisir)
  2. Reusabilitas (Fungsi yang sudah dibuat dapat digunakan kembali)
  3. Penyederhanaan (menyembunyikan detail implementasi yang kompleks dan hanya memerlukan input dan output yang relevan)

Kali ini saya membuat dua fungsi untuk

# Fungsi untuk Menghitung jumlah hari dalam tahun tertentu 

numberOfDays <- function(date) {
  m <- format(date, format="%m")
  while (format(date, format="%m") == m) {date <- date + 1}
  return(as.integer(format(date - 1, format="%d")))
}

# Fungsi utama untuk memformat tabel data hujan tipikal kedalam bentuk tabel yang lebih sederhana

standardPrec <- function(f){
  years <- excel_sheets(path = f)
  firstyear <- paste('19',years[1],sep='')
  lastyear <- as.character(as.integer(firstyear)+length(years)-1)
  allDates <- seq(as.Date(paste(firstyear,"/01/01",sep='')),as.Date(paste(lastyear,"/12/31",sep='')), by = "day")
  dfout <- data.frame(Date=NULL,Value=NULL)
  for (i in years){
    iyear <- strftime(as.Date(i,"%y"), "%Y")
    df <- read_excel(f, sheet = i,col_names = FALSE,
                     .name_repair = ~ vctrs::vec_as_names(..., repair = "unique", quiet = TRUE))
    #idx0 <- which(df == "TANGGAL", arr.ind = TRUE); x0<- idx0[2]+1; y0<- idx0[1]+1
    idx0 <- which(df == "JAN", arr.ind = TRUE); x0<- idx0[2]; y0<- idx0[1]+1
    x1 <- which(df == "DES", arr.ind = TRUE)[2]
    y1 <- which(df == "31", arr.ind = TRUE)[1]
    subdf <- df[y0:y1,x0:x1]
    colnames(subdf) <- 1:12 

    if (all(is.na(subdf))==T) {
      #print(paste('Skip for year',i,sep=''))
    }else{
      lst <- append(lst,i)
      dating <- as.Date(paste())
      for (j in 1:12){
        imonth <- as.character(j)
        numdays <- numberOfDays(as.Date(paste(iyear,'-',imonth,'-1',sep='')))
        for (k in 1:numdays){
          dates <- as.Date(paste(iyear,imonth,k,sep='-'))
          val <- as.numeric(subdf[k,imonth])
          dfin <- data.frame(Date=dates,Value=val) 
          dfout <- rbind(dfout,dfin)
        }
      }      
      #print(i)
    }
    #cat('Processing', c, 'of', length(allDates),'\n')
  }
  return(dfout)
}

Edit function diatas sesuai dengan pola tabel data hujan di excel anda. Masing-masing institusi format dapat berbeda. Misal tanggal 1 bulan januari terletak di cell “B18” sedang dalam format lain tidak. Pahami dan sesuaikan coding diatas.

3. Menjalankan program

Setelah running fungsi tersebut anda dapat running main code berikut

# set direktori default pada direktori diatas 
# semua file yang akan anda proses ada di dalam folder ini
setwd('F:/Research-master/')

# set direktori keluaran
dirout <- 'F:/Research-master/olah/'


# set daftar file yang akan dilakukan pemrosesan (khususnya untuk jumlah file lebih dari satu)
# disini akan dipilih semua file yang berekstensi '*.xlsx'
lst <- list.files(pattern=glob2rx('*.xlsx'))


# iterasi untuk masing masing file
m<-1

for (n in m:length(lst)){
  f <- lst[n]
  print(f)
  ext <- tail(strsplit(f,split='.',fixed=T)[[1]],1)
  namae <- gsub(ext, 'csv', f)
  df <- standardPrec(f)
  p <- paste(dirout,namae,sep='')
  write.csv(df,p)
}

Selamat mencoba!

Comments

comments