Bölüm 7 Veri Okuma-Yazma ve Tarih Nesneleri

R programlama dili istatistiksel programlama dili olduğundan hali hazırda çeşitli istatistiki dosya formatlarını okuyabilir. Ayrıca ek paketler sayesinde json, excel, word, vs dosya formatlarını da okuyup yazabilir. Genel olarak okunan veri data.frame türünde olur.

7.1 CSV Dosya Formatı

Csv dosyaları genel olarak virgülle yarılmış tablo şeklindeki düz metinlerdir. R programlama dili bu tür dosyaları okumak için dil içerisinde önceden yüklü (default) olarak gelen utils paketinin read.csv() fonksiyonunu kullanır. Örneğe geçmeden önce bir noktaya değinmemiz gerekir. R programlama dili ilk çalışmaya başladığında kendisine otomatik olarak bir “çalışma klasörü/working directory” belirler. Yüklemek istediğimiz verinin tam yolu belirtilmediği sürece dosyayı çalışma dizininde arar. Eğer tam dosya yolunu belirtmek istemezsek çalışacağımız veri dosyasını çalışma dizinine eklememiz gerekir. Aksi halde hata verecektir. Eğer tam dosya yolunu yazacaksak bunları çeşitli kurallara uyarak yazmalıyız. Aksi takdirde belirtilen yolda dosya bulunamayabilir.

Şimdi çalışma dizinimizdeki “Istanbul_Baraj_Doluluk_Oranlari.csv” isimli veriyi doluluk isimli değişkene aktaralım. Ardından tail fonksiyonu son altı satırını ekrana yazdıralım ve str fonksiyonu ile veriyi inceleyelim.(@ref(07.1).)

Not: Bu veri İBB nin sunduğu bir veridir. Diğer verilere İBB Açık Veri Portalı adresinden ulaşılabilir.

doluluk = read.csv("data/07/Istanbul_Baraj_Doluluk_Oranlari.csv")
tail(doluluk)
##            DATE GENERAL_DAM_OCCUPANCY_RATE
## 5772 2020-10-22                      31.85
## 5773 2020-10-23                      31.68
## 5774 2020-10-24                      31.40
## 5775 2020-10-25                      31.16
## 5776 2020-10-26                      30.89
## 5777 2020-10-27                      30.63
##      GENERAL_DAM_RESERVED_WATER
## 5772                        276
## 5773                        275
## 5774                        272
## 5775                        270
## 5776                        268
## 5777                        266

str(doluluk)
## 'data.frame':    5777 obs. of  3 variables:
##  $ DATE                      : chr  "2005-01-01" "2005-01-02" "2005-01-03" "2005-01-04" ...
##  $ GENERAL_DAM_OCCUPANCY_RATE: num  44.6 44.6 44.5 44.4 44.4 ...
##  $ GENERAL_DAM_RESERVED_WATER: int  388 388 386 386 385 385 384 382 381 379 ...

İstanbul Maslak hava kalitesi verisi için bir örnek.

olcum = read.csv("data/07/istanbul_istasyonlar.csv", sep=";", encoding = "utf-8")
head(olcum)
##                                     Id       Name
## 1 6b7a9840-1e13-4045-a79d-0f881c4852ad     Maslak
## 2 914b525e-f275-41e1-b45b-118ada8f08c3    Esenler
## 3 6929a9ca-977d-4cb3-b1b5-26b95f4d4515  Yenibosna
## 4 41f90c1f-570d-46cd-9beb-493d9162639a    Mobil 1
## 5 377e1216-bcc7-42c0-aad8-4d5b3d602b78 Ümraniye 1
## 6 cb4cd1c2-b55b-484f-ac7a-505369405d00    Aksaray
##                             Adress   Boylam    Enlem
## 1      İstanbul / Sarıyer - Turkey 29.02451 41.10007
## 2      İstanbul / Esenler - Turkey 28.88807 41.03687
## 3 İstanbul / Bahçelievler - Turkey 28.82703 40.99739
## 4               İstanbul - Mobil 1 28.97883 41.00737
## 5     İstanbul / Ümraniye - Turkey 29.16181 41.01269
## 6        İstanbul / Fatih - Turkey 28.95395 41.01442

str(olcum)
## 'data.frame':    28 obs. of  5 variables:
##  $ Id    : chr  "6b7a9840-1e13-4045-a79d-0f881c4852ad" "914b525e-f275-41e1-b45b-118ada8f08c3" "6929a9ca-977d-4cb3-b1b5-26b95f4d4515" "41f90c1f-570d-46cd-9beb-493d9162639a" ...
##  $ Name  : chr  "Maslak" "Esenler" "Yenibosna" "Mobil 1" ...
##  $ Adress: chr  "İstanbul / Sarıyer - Turkey" "İstanbul / Esenler - Turkey" "İstanbul / Bahçelievler - Turkey" "İstanbul - Mobil 1" ...
##  $ Boylam: num  29 28.9 28.8 29 29.2 ...
##  $ Enlem : num  41.1 41 41 41 41 ...

Burada ilk argüman file parametresi olarak eklenmiştir ve Dosya yolunu belirtir. sep parametresi ile ayraç belirtilmiştir(read.csv fonksiyonun varsayılan sep değeri virgüldür). encoding parametresi ile de csv dosyasının karakter kodlama biçimi belirtilmiştir. Türkçe Windows işletim sistemlerinde (Windows 7/8/10) karakter kodlama biçimi “cp1254” tür (cp1254 başka isimlerle de çağrılır).

read.csv fonksiyonunda en çok kullanılan parametreler:

  • file : verinin okunacağı dosyanın adı. Eğer dosya çalışma dizininde ise sadece adının yazılması yeterlidir. Aksi takdirde dosyasının tam yolu yazılmalıdır. Ayrıca doğrudan internet adresi de olabilir.
  • header : Eğer dosya ilk satırda sütun isimlerini içeriyorsa True olmalı değilse False olmalı. Varsayılan değeri True dir.
  • sep : Tablodaki her bir sütunun hangi karakter ile ayrıldığının bildirilmesini sağlar. Varsayılan değeri “,” dür.
  • dec : ondalik ayıracın ne olacağını belirlememizi sağlar. Varsayılan değeri ‘.’ dır.

Ayrıca read.csv2 fonksiyonu ile de csv dosyası okunabilir. Fakat read.csv2 fonksiyonunda sep parametresinin varsayılan değeri ‘;’ ve dec parametresinin varsayılan değeri “,” dür. Bir csv dosyası okunacağı zaman dikkat edilmesi gereken hücre ayıracının, ondalık ayıracının ne olduğu ve ilk satırda sütun isimlerinin olup olmadığıdır. Diğer parametreler için help fonksiyonundan yaralanabilirsiniz.

R programama dilinde csv dosyasına veri yazabilmek için write.csv isimli fonksiyondan yararlanılabilir. Örneğin bir data.frame oluşturup csv uzantılı dosyaya yazalım.

# Öğrenci notlarını içeren data.frame nesnesi
ogrenci = c("ali", "veli", "selami")
no = 50:52
yazili1 = c(75,80,65)
yazili2 = c(65,90,85)
veri_mat = data.frame(no, ogrenci, yazili1, yazili2)
getwd()
# 
write.csv(x=veri_mat, file="mat_notu.csv", row.names = F, quote = F)
# dosyayı not defteri ile açarsanız aşağıdaki şekilde yazılmış olduğunu görürsünüz. 
# no,ogrenci,yazili1,yazili2
# 50,ali,75,65
# 51,veli,80,90
# 52,selami,65,85

write.csv fonksiyonunda kullanılabilecek bazı parametreler:

  • x : dosyaya yazılacak veri (matris veya data.frame)
  • file : dosyanın adı
  • append : verinin dosyanın üzerine mi yoksa devamına mı yazılacağını belirtmmizi sağlar. Varsayılan değeri False dur.
  • sep : hücre ayracını belirlememizi sağlar. Varsayılan değeri “,” dür.
  • dec : ondalık ayracı belirlememizi sağlar varsayılan değeri “.” dır.
  • col.names : sütun isimlerinin dosyaya yazılı yazılmayacağını belirtmemizi sağlar. Varsayılan değeri True dur.
  • row.names : satır isimlerinin dosyaya yazılı yazılmayacağını belirtmemizi sağlar. Varsayılan değeri True dur.

write.csv2 fonksiyonu ile de csv dosyasına veri yazılabilir. sep ve dec parametrelerinin varsayılan değerleri sırasıyla “;” ve “,” dür. Daha fazla bilgi almak için help fonskiyonunu kullanınız.

“olcum” verisine baktığımızda 5 değişken üzerinde 28 gözlem içeren bir data.frame olduğunu anlıyoruz. R programlama dili , değişkenleri virgül verine “tab” ile ayrılmış (tab delimited files) “.txt” uzantılı metin dosyalarını açmak için read.delim(), diğer formatlardaki “.txt” dosyalarının açılması için ise read.table() fonksiyonlarını kullanır. Her iki tipin kullanımı read.csv() fonksiyonu gibi olsa da farklılıklar için yardım dosyasını kontrol etmeniz gerekecektir.

Daha Önce de anlatıldığı gibi R programlama dilinde kullanıcılar tarafından yazılmış olan paketler kullanır. R programlama dilinde veri aktarımı için kullanılan birçok paket bulunmasına rağmen en kullanışlı olanlarından biri readr paketidir. readr hızı ve kullanım kolaylığı açısından diğer paketlerden farklılaşır. Her paket kullanımı için yapıldığı gibi readr paketini de kullanmak için ilk başta paketi indirmeli ve sonra da R oturumuna eklemeliyiz. Aşağıdaki komutlar ile bu işi yapıp daha sonra “istanbul_istasyonlar.csv” dosyasını readr paketinin read_csv() fonksiyonu ile R’a aktaralım:

# Paketin indirilmesi ve R oturumuna eklenmesi
install.packages("readr")

readr paketi yüklendi artık library fonksiyonu yardımıyla projemize ekleyip kullanabiliriz.

library(readr)
olcum2 = read_csv2("data/07/istanbul_istasyonlar.csv", 
    locale = locale("en", decimal_mark = ","), col_names = T)
## 
## ── Column specification ────────────────────────────────────
## cols(
##   Id = col_character(),
##   Name = col_character(),
##   Adress = col_character(),
##   Boylam = col_number(),
##   Enlem = col_number()
## )
olcum2[, -1]
## # A tibble: 28 x 4
##    Name         Adress                        Boylam   Enlem
##    <chr>        <chr>                          <dbl>   <dbl>
##  1 Maslak       İstanbul / Sarıyer - Turkey  2.90e16 4.11e16
##  2 Esenler      İstanbul / Esenler - Turkey  2.89e16 4.10e16
##  3 Yenibosna    İstanbul / Bahçelievler - T… 2.88e15 4.10e16
##  4 Mobil 1      İstanbul - Mobil 1           2.90e16 4.10e16
##  5 Ümraniye 1   İstanbul / Ümraniye - Turkey 2.92e16 4.10e14
##  6 Aksaray      İstanbul / Fatih - Turkey    2.90e16 4.10e16
##  7 Mobil 2      Mobil 2                      2.89e16 4.11e16
##  8 Beşiktaş     İstanbul / Beşiktaş - Turkey 2.90e16 4.11e15
##  9 Kadıköy      İstanbul / Kadıköy - Turkey  2.90e16 4.10e16
## 10 Sultangazi 1 İstanbul / Sultangazi - Tur… 2.89e16 4.11e16
## # … with 18 more rows

# str(olcum2)

read_csv() fonksiyonu, veriyi “tibble” adı verilen bir format ile saklar. Konsola “olcum2” yazıp incelediğimizde bu işlem sonucunda oluşan “tibble” a ait 28 satır(gözlem) ve 5 sütun (değişken) olduğunu görüyoruz. Ayrıca her sütunda bulunan değişkenlere ait isimler ve bu değişkenlerin türleri de raporlandı. Tibble veri formatı ileride karşımıza çıkabilecek bir veri türüdür. readr hakkında diğer bilgilere ulaşmak için yardım dokümanına bakabilirsiniz. write_csv fonksiyonu ile de dosyaya veri yazılabilir.

write_csv fonksiyon parametreleri:

  • x : data.frame veya tibble nesnesi,
  • file : yazılacak dosya,
  • na : NA değerlerin dosyaya nasıl yazılacağını belirtmemizi sağlar. varsayılanı “NA”,
  • append : dosyanın üzerine veya devamına yazılacağını belirtmemizi sağlar. varsayılanı False dur (yazni dosyanın üzerine yazılır),
  • col_names : sütun isimlerinin dosyaya yazılıp yazılmayacağını belirtmemizi sağlar. öntanımlı değeri appand parametresinin değilidir.
write_csv(x=veri_mat, file="mat_notu.csv")

7.2 Excel Dosya Formatı

Çalışmalarımız sırasında MS Excel dosyalarından da yararlanacağız. Excel dosyalarını R programlama dili içerisinde açmak için birçok paket bulunsa da, biz burada readxl ve xlsx paketlerini inceleyeceğiz.

7.2.1 readxl Paketi

Excel dosyaları sheet adı verilen sayfalardan oluşan defterlere benzer. Veri ise bu sayfalar içerisinde tablo formatında işlenmiş şekli ile yer alır. readxl istersek defterin tümünü istersek de gerekli sayfayı R içine aktarır. Not: readxl paketinde excel dosyasına veri yazmamızı sağlayacak fonksiyon bulunmamaktadır.

# önce readxl dosyasını R programlama dili için indirin
install.packages("readxl")

İndirme işlemi bittikten sonra artık kullanabiliriz.

library(readxl)

olcum2 = read_xlsx("data/07/istanbul_istasyonlar.xlsx", sheet = "istanbul_istasyonlar", col_names = T)
head(olcum2)
## # A tibble: 6 x 5
##   Id                  Name    Adress            Boylam Enlem
##   <chr>               <chr>   <chr>              <dbl> <dbl>
## 1 6b7a9840-1e13-4045… Maslak  İstanbul / Sarıy…   29.0  41.1
## 2 914b525e-f275-41e1… Esenler İstanbul / Esenl…   28.9  41.0
## 3 6929a9ca-977d-4cb3… Yenibo… İstanbul / Bahçe…   28.8  41.0
## 4 41f90c1f-570d-46cd… Mobil 1 İstanbul - Mobil…   29.0  41.0
## 5 377e1216-bcc7-42c0… Ümrani… İstanbul / Ümran…   29.2  41.0
## 6 cb4cd1c2-b55b-484f… Aksaray İstanbul / Fatih…   29.0  41.0

Çıktıdan görüleceği üzere read_xlsx ile tibble türünde bir nesne dönmektedir. read_xlsx fonksiyonuna argüman olarak sırasıyla dosya yolu, sayfa adı ve başlık satırı içerip içermediği bilgisi verilmiştir. Ayrıca sayfa isimlerini öğrenmek için excel_sheets fonksiyonundan yararlanılabilir.

excel_sheets("data/07/istanbul_istasyonlar.xlsx")
## [1] "istanbul_istasyonlar" "Boş"

Örneğin ilk sayfayı açmak için aşağıdaki kod kullanılabilir.

dosya = "data/07/istanbul_istasyonlar.xlsx"
olcum2 = read_xlsx(dosya, sheet = excel_sheets(dosya)[1], col_names = T)
head(olcum2)
## # A tibble: 6 x 5
##   Id                  Name    Adress            Boylam Enlem
##   <chr>               <chr>   <chr>              <dbl> <dbl>
## 1 6b7a9840-1e13-4045… Maslak  İstanbul / Sarıy…   29.0  41.1
## 2 914b525e-f275-41e1… Esenler İstanbul / Esenl…   28.9  41.0
## 3 6929a9ca-977d-4cb3… Yenibo… İstanbul / Bahçe…   28.8  41.0
## 4 41f90c1f-570d-46cd… Mobil 1 İstanbul - Mobil…   29.0  41.0
## 5 377e1216-bcc7-42c0… Ümrani… İstanbul / Ümran…   29.2  41.0
## 6 cb4cd1c2-b55b-484f… Aksaray İstanbul / Fatih…   29.0  41.0

Buraya kadar tüm dosyaları bilgisayarımızdan açtık. Yukarıda bahsettiğimiz okuma fonksiyonları internette bulunan kendi formatlarına uyguna dosya adreslerini de açabilirler. Örneğin İstanbul baraj doluluk oranlarını gösteren internet üzerindeki csv dosyasındaki veri aşağıdaki gibi doğrudan path parametresine internet adresi yazılarak da alınabilir.

doluluk = read_csv("https://data.ibb.gov.tr/dataset/19c14482-14f2-4803-b4df-4cf4c6c42016/resource/b68cbdb0-9bf5-474c-91c4-9256c07c4bdf/download/dam_occupancy.csv")
## 
## ── Column specification ────────────────────────────────────
## cols(
##   DATE = col_date(format = ""),
##   GENERAL_DAM_OCCUPANCY_RATE = col_double(),
##   GENERAL_DAM_RESERVED_WATER = col_double()
## )
head(doluluk)
## # A tibble: 6 x 3
##   DATE       GENERAL_DAM_OCCUPANCY_… GENERAL_DAM_RESERVED_W…
##   <date>                       <dbl>                   <dbl>
## 1 2005-01-01                    44.6                     388
## 2 2005-01-02                    44.6                     388
## 3 2005-01-03                    44.5                     386
## 4 2005-01-04                    44.4                     386
## 5 2005-01-05                    44.4                     385
## 6 2005-01-06                    44.3                     385

readxl paketi yalnızca dosyadan okuma yapmaya yarar. Bir veriyi dosyaya yazmak için writexl paketinin ayrıca kurulması gerekir. readxl çokça kullanılsa da excel dosyasından okuma yapan tek paket değildir.

7.2.2 xlsx Paketi

xlsx paketi readxl paketi gibi excelden veri okuyabilir. Bu paket R programlama diline dahili olarak gelmediğinden önce kurmalıyız.

install.packages("xlsx")

Kurulum hatasız bir şekilde tamamlandıktan sonra library fonksiyonu ile projemize dahil ederek kullanabiliriz.

library(xlsx)

veri = read.xlsx(file = "data/07/istanbul_istasyonlar.xlsx", sheetName = "istanbul_istasyonlar", encoding = "utf-8")
head(veri)
##                                     Id       Name
## 1 6b7a9840-1e13-4045-a79d-0f881c4852ad     Maslak
## 2 914b525e-f275-41e1-b45b-118ada8f08c3    Esenler
## 3 6929a9ca-977d-4cb3-b1b5-26b95f4d4515  Yenibosna
## 4 41f90c1f-570d-46cd-9beb-493d9162639a    Mobil 1
## 5 377e1216-bcc7-42c0-aad8-4d5b3d602b78 Ümraniye 1
## 6 cb4cd1c2-b55b-484f-ac7a-505369405d00    Aksaray
##                             Adress   Boylam    Enlem
## 1      İstanbul / Sarıyer - Turkey 29.02451 41.10007
## 2      İstanbul / Esenler - Turkey 28.88807 41.03687
## 3 İstanbul / Bahçelievler - Turkey 28.82703 40.99739
## 4               İstanbul - Mobil 1 28.97883 41.00737
## 5     İstanbul / Ümraniye - Turkey 29.16181 41.01269
## 6        İstanbul / Fatih - Turkey 28.95395 41.01442

read.xlsx fonksiyonunda kullanılabilecek bazı parametreler:

  • file : verinin olduğu excel dosyası,
  • sheetIndex : sayfa sıra numarasıyla belirtilen sayfanın okunmasını sağlar,
  • sheetName : sayfa ismiyle belirtilen sayfanın okunmasını sağlar,
  • rowIndex : dosyadaki verinin hangi satırlarının alınacağını belirtmemizi sağlayan vektör,
  • startRow : dosyadaki verinin hangi satırdan itibaren alınacağını belirtmemizi sağlar,
  • endRow : dosyadaki verinin hangi satıra kadar alınacağını belirtmemizi sağlar,
  • colIndex : dosyadaki verinin hangi sütunlarının alınacağını indis vektörü olarak belirtmemizi sağlar,
  • header : seçilen alandaki ilk satırın sütun isimlerini içerip içermediğini belirtmek için,
  • password : dosya eğer şifreli ise şifrenin metin olarak yazılabileceği parametredir. Daha fazlası için help fonksiyonunu kullanabilirsiniz.

xlsx paketi nin sağladığı fonksiyonlar yardımıyla excel dosyalarına veri yazılabilmektedir. Aşağıda bir örnek gösterilmektedir.

ogrenci = c("ali", "veli", "selami", "ahmet")
no = 50:53
yazili1 = c(75,80,65, NA)
yazili2 = c(65,90,85, 95)
veri_mat = data.frame(no, ogrenci, yazili1, yazili2)

write.xlsx(
  x=veri_mat, 
  file="Notlar.xlsx",
  sheetName = "Matematik",
  col.names = T,
  row.names = F,
  showNA = F)

Kaydedilen verinin excel programı ile görüntüsü

write.xlsx fonksiyonu ile kullanılabilecek bazı parametreler:

  • x : data.frame nesnesi
  • file : dosya adı
  • sheetName : sayfa adı
  • col.names : sütun isimlerinin dosyaya yazılıp azılmayacağını gösteren mantıksal parametre
  • row.names : satır isimlerinin dosyaya yazılıp azılmayacağını gösteren mantıksal parametre
  • showNA : NA değerlerin dosyada gösterilip gösterilmeyeceğini belirleyebileceğimiz parametre
  • append : dosyanın üzerine yazılıp yazılmayacağını gösteren parametre

7.3 Json Dosya Formatı

jsonlite Web üzerinde JSON formatındaki veriyi R içine aktarmaya yarayan R paketlerinden biridir. Filmler hakkındaki veriyi JSON formatına çeviren “OMDb API” üzerinden “Şaban Oğlu Şaban” filmine ait veriyi indiren aşağıdaki kodu inceleyin. Bu kod sonuç olarak (response) bir liste nesnesi oluşturacak. Kod aynı zamanda oluşan listeyi as.data.frame() fonksiyonu ile bir veri tabanı haline çeviriyor. Environment penceresinde oluşan veri tabanına tıklayarak indirdiğiniz veriyi inceleyebilirsiniz.

library(jsonlite)
saogsa <- as.data.frame(fromJSON("http://www.omdbapi.com/?i=tt0253614&apikey=26dfe1bd"))

head(saogsa[, 1:4])
##              Title Year Rated    Released
## 1 Saban Oglu Saban 1977   N/A 01 Dec 1977

Örnek: İstanbul hava kalitesini ölçen istasyon bilgilerini internet ortamından alıp gösteren kod.

ist = as.data.frame(fromJSON("https://api.ibb.gov.tr/havakalitesi/OpenDataPortalHandler/GetAQIStations"))
head(ist[, 2:3])
##         Name                           Adress
## 1     Maslak      İstanbul / Sarıyer - Turkey
## 2    Esenler      İstanbul / Esenler - Turkey
## 3  Yenibosna İstanbul / Bahçelievler - Turkey
## 4    Mobil 1               İstanbul - Mobil 1
## 5 Ümraniye 1     İstanbul / Ümraniye - Turkey
## 6    Aksaray        İstanbul / Fatih - Turkey

Verilerimizi JSON formatında saklayabiliriz. Bunun için write_json foknsiyonunu kullanabiliriz.

write_json(veri_mat, "mat_notlar.json")

Kaydedilen JSON dosyası

7.4 Tarih Nesleleri ve Fonksiyonları

Dikkat edildiyse daha önce dosyalardan okutulan verilerdeki Tarih sütunları metin türündeydi. Metin türündeki tarihlerle işlemler yapılamayacağı için bunların tarih nesnelerine dönüştürülmeleri gerekmektedir. Bunun için çeşitli fonksiyonlar bulunmaktadır. Bunlardan bazıları as.POSIXct ve as.Date fonksiyonlarıdır. as.Date sadece tarih verisini tutarken as.POSIXct hem tarih hem de saat bilgilerini göstermektedir. Varsayınlan Tarih gösterimi “dört_basamaklı_yıl-iki_basamak_ay-iki_basamak_gün”, saat biçimi “saat:dakika:saniye” (iki basamaklı)dır. Ayrıca Sys.time, date fonksiyonları şuanki tarihi ve saati verir, Sys.Date date fonksiyonu şuanki Tarihi verir.

Anlık tarih ve saat bilgileri.

Sys.time()  # Varsayılan format
## [1] "2021-08-22 02:32:34 +03"

date()  # Özel tarih formatı
## [1] "Sun Aug 22 02:32:34 2021"

Sys.Date()  # "sadece Tarih"
## [1] "2021-08-22"

Doğrudan anlık Tarih ve saat bilgileri alınabildiği gibi kendi tarih nesnelerimizi oluşturabiliriz.

as.Date("2020-11-25 15:24")
## [1] "2020-11-25"
# çıktı: "2020-11-15"

as.POSIXct("2020-11-25 15:24")
## [1] "2020-11-25 15:24:00 +03"
# çıktı: 2020-11-25 15:24:00 +03
# as.POSIXct en sonda zaman dilimini de göstermektedir.

as.Date fonksiyonu parametreleri:

  • x : dönüştürülecek nesne
  • format : metin türünde dönüştürme biçimi. Biçim uygun değilse hata verir.
  • tryFormats : metin vektöründe dönüştürme biçimi. İlk hangi biçime uygun bulursa o biçime göre devam eder. Varsayılanı c(“%Y-%m-%d”, “%Y/%m/%d”).
  • origin : başlangıç tarihi belirtmemizi sağlar
  • tz : zaman dilimi adı

Örnek: format parametresi

as.Date("21.12.2020")  # hatalı 
## Error in charToDate(x): character string is not in a standard unambiguous format

as.Date("21.12.2020", format="%d.%m.%Y")
## [1] "2020-12-21"

Örnek: tryFormat parametresi

t = c("2020-12-11", "2020/12/12", "2020-12-13")
as.Date(t)
## [1] "2020-12-11" NA           "2020-12-13"

as.Date("2020/12/12")
## [1] "2020-12-12"

7.4.1 Biçimlendirme

Tarih nesnesi oluşturulsa da varsayılan biçimi “Yıl-ay-gün Sa:Dk:Sn” şeklindedir. Tarih nesnesinde istediğimiz veriyi alabilmek için format fonksiyonunu kullanarak biçim belirtmeliyiz.

a = Sys.time()

format(a, "%A") # gün adı
## [1] "Pazar"
format(a, "%B") # Ay adı
## [1] "Ağustos"
format(a, "%Y") # yıl (4 basamaklı)
## [1] "2021"
format(a, "%y") # yıl (son iki basamak)
## [1] "21"
format(a, "%m") # yılın kaçıncı ayı 
## [1] "08"
format(a, "%d") # ayın kaçıncı günü
## [1] "22"
format(a, "%w") # haftanın kaçıncı günü
## [1] "0"
format(a, "%W") # yılın kaçıncı haftası
## [1] "33"
format(a, "%H") # saat (iki basamaklı)
## [1] "02"
format(a, "%M") # dakika (iki basamaklı)
## [1] "32"
format(a, "%Z") # yerel tarih saat  
## [1] "+03"
format(a, "%x") # dakika (iki basamaklı)
## [1] "22-08-2021"

Biçimlendirme kodları Tablo 7.1

Tablo 7.1: Tarih biçimlendirme kodları.
Kod Anlam Kod Anlam
%a Gün Adı kısa %A Gün Adı
%b Ay adı kısa %B Ay adı
%c yerel tarih saat biçimi %d ayın günü
%H Saat (24 lük) %I Saat (12 li)
%j yılın toplam gün sayısı %m yılın ayı
%M Dakika %p Yerel ÖÖ/ÖS
%S Saniye %U yılın haftası (pazar ile başlar)
%w Haftanın günü (0=Pazar) %W yılın haftası (pazartesi ile başlar)
%x Yerel tarih %X yerel saat
%y 2 basamaklı yıl %Y 4 basamaklı yıl
%z GMT zaman dilimi %Z zaman dilimi (metin)

Soru: Doğum gününüzün ismini format fonksiyonu yardımıyla ekrana yazdıran kodu yazınız.

7.4.2 lubridate Paketi

lubridate paketi R programlama diline dahil olarak gelmeyen çeşitli tarih veya saat fonksiyonları barındıran bir pakettir. Bu paket ile önceki konuda anlatılan tarih nesneleri oluşturulup işlenebilmektedir. Öncelikle R programı açılarak bu paketin kurulması gerekmektedir. Bunun için konsola aşağıdaki kodun yazılması yeterlidir. Bu kod paketi makinemize indirerek kuracaktır.

install.packages("lubridate")

Artık library fonksiyonu yardımıyla projemize dahil ederek kullanabiliriz. Çeşitli fonksiyonlarla tarih-saat nesneleri elde edilebilir.

library(lubridate)  # paket projeye dahil edildi

# anlık tarih-saat bilgisi alma
t1 = now()
t1
## [1] "2021-08-22 02:32:34 +03"

# çeşitli şekillerde tarih-saat nesnesi oluşturulabilir.
# lubridate paketine ait as_datetime ile 
t2 = as_datetime("2020-12-25 05:14:51") 
t2
## [1] "2020-12-25 05:14:51 UTC"

# R programına dahil olan as.POSIXct ile oluşturulan nesneler 
# lubridate paketine ait fonksiyonlarla kullanılabilir
t3 = as.POSIXct("2021-01-05 14:03:07")
t3
## [1] "2021-01-05 14:03:07 +03"

# dmy_hms fonksiyonunda önemli olan 
# gün.ay.yıl sa:dk:sn sırasına uygun bir 
# metin veya nümeric vektörü yazmak yeterlidir
t4 = dmy_hms("05.01.2021 5:24:46")  
t4
## [1] "2021-01-05 05:24:46 UTC"

# nümerik olarak da tarih bilgisi verilebilir.
# sırasıyla ilk iki karakter gün (05)
# sonraki ikili ay (01) sonraki dörtlü yıl (2021)
# sonraki ikililer sırasıyla saat (05), dakika (24) ve saniyedir (46).
t5 = dmy_hms(05012021052446)
t5
## [1] "2021-01-05 05:24:46 UTC"

# dmy_hms fonksiyonunun farklı versiyonları da mevcuttur. ydm_hms, mdy_hms bunlardan bazılarıdır. daha fazlası için lubridate paketini inceleyiniz.

Sadece tarih nesneleri de oluşturabiliriz.

library(lubridate)

simdi = today()  # günün tarihini döndürür

# dmy fonksiyonu ile sırasıyla 
# gün, ay,yıl belirtilerek tarih nesnesi oluşturma
t1 = dmy(05122048)
t1
## [1] "2048-12-05"

# ay, gün, yıl sırasıyla tarih blirtmek için
t2 = mdy(05121994)
t2
## [1] "1994-05-12"

# ay, gün, yıl arasındaki karakerlerin ne olduğu önemli değildir.
t3 = mdy("05?12_1994")
t3
## [1] "1994-05-12"

lubridate paketinin sağladığı fonksiyonlarla tarih-saat nesnelerinden çeşitli değerler elde edilebilir.

library(lubridate)

t = dmy_hms("13-03-2020 15:28:41")

day(t)  # ayın kaçıncı günü oluğunu verir
## [1] 13
month(t)  # yılın kaçıncı ayı
## [1] 3
year(t)  #  yıl
## [1] 2020
hour(t)  # saat
## [1] 15
minute(t) # dakika
## [1] 28
second(t) # saniye
## [1] 41
wday(t, week_start = 1)  # haftanın kaçıncı günü
## [1] 5

# week_start parametresi haftanın hangi gün ile 
# başladığını belirtmek için kullanılır. Varsayılanı 0 (Pazar)dır.
wday(t, label=T, week_start = 1) # gün ismi (Pazartesi=1)
## [1] Cum
## Levels: Pzt < Sal < Çrş < Prş < Cum < Cts < Paz
yday(t) # yılın kaçıncı günü
## [1] 73
month(t, label = T)
## [1] Mar
## 12 Levels: Oca < Şub < Mar < Nis < May < Haz < ... < Ara

Tarih nesnesinden belirli tarih öncesini/sonrasını elde edebiliriz. Örneğimizde bunu inceleyelim.

library(lubridate)

# yıl,ay,gün sıralaması ile tarih nesnesi oluşturma
t = ymd_hms("2020-08-13 11:43:12") # bugün
dun = t - days(1)               # dün
yarin = t + days(1)             # yarın
t2 = t + months(1)              # 1 ay sonra
t3 = t + years(1)               # 1 yıl sonra
t4 = t + years(1) + days(149)   # 1 yıl 149 gün sonra

print(paste("dün         : ", dun))
## [1] "dün         :  2020-08-12 11:43:12"
print(paste("bugün       : ", t))
## [1] "bugün       :  2020-08-13 11:43:12"
print(paste("yarın       : ", yarin))
## [1] "yarın       :  2020-08-14 11:43:12"
print(paste("1 ay sonra  : ", t2))
## [1] "1 ay sonra  :  2020-09-13 11:43:12"
print(paste("1 yıl sonra : ", t3))
## [1] "1 yıl sonra :  2021-08-13 11:43:12"

print(paste("1 yıl 149 gün sonra", t4))
## [1] "1 yıl 149 gün sonra 2022-01-09 11:43:12"

Soru: Parametre olarak girilen tarih nesnesinden o tarihe ait hafta başını bulan fonksiyonu yazınız. Örneğin “2020-06-12” (Cuma) tarihi için hafta başı “2020-06-08” (Pazartesi) dir.