5  Tarih ve Zaman İşlemleri

Tarihler, Date sınıfı tarafından temsil edilir ve as.Date() işlevi kullanılarak bir karakter dizesinden oluşturulabilir. Bu, R’de bir Date nesnesi elde etmenin yaygın bir yoludur. Date sınıfı varsayılan olarak tarihleri 1 Ocak 1970’den bu yana geçen günlerin sayısı olarak temsil eder. as.Date() işlevinin kullanılması bir karakter dizesinden Date nesneleri oluşturmamıza olanak tanır. Varsayılan biçim “YYYY/m/d” veya “YYYY-m-d” şeklindedir.

Sys.Date()
[1] "2024-04-22"
class(Sys.Date())
[1] "Date"
myDate <- as.Date("2022-01-04")

class(myDate)
[1] "Date"
# format argümanı ile tarih formatı tanımlanabilir
as.Date("12/31/2021", format = "%m/%d/%Y")
[1] "2021-12-31"
# year
format(myDate, "%Y")
[1] "2022"
as.numeric(format(myDate, "%Y"))
[1] 2022
# weekday
weekdays(myDate)
[1] "Salı"
# month
months(myDate)
[1] "Ocak"
# quarters
quarters(myDate)
[1] "Q1"
# create date sequence 
date_week <- seq(from = as.Date("2021-10-1"), 
    to = as.Date("2021/12/31"), 
    by = "1 week")

date_week
 [1] "2021-10-01" "2021-10-08" "2021-10-15" "2021-10-22" "2021-10-29"
 [6] "2021-11-05" "2021-11-12" "2021-11-19" "2021-11-26" "2021-12-03"
[11] "2021-12-10" "2021-12-17" "2021-12-24" "2021-12-31"
date_day <- seq(from = as.Date("2021-12-15"), 
    to = as.Date("2021/12/31"), 
    by = "day")

date_day
 [1] "2021-12-15" "2021-12-16" "2021-12-17" "2021-12-18" "2021-12-19"
 [6] "2021-12-20" "2021-12-21" "2021-12-22" "2021-12-23" "2021-12-24"
[11] "2021-12-25" "2021-12-26" "2021-12-27" "2021-12-28" "2021-12-29"
[16] "2021-12-30" "2021-12-31"
date_month <- seq(from = as.Date("2021-1-15"), 
    to = as.Date("2021/12/31"), 
    by = "month")

date_month
 [1] "2021-01-15" "2021-02-15" "2021-03-15" "2021-04-15" "2021-05-15"
 [6] "2021-06-15" "2021-07-15" "2021-08-15" "2021-09-15" "2021-10-15"
[11] "2021-11-15" "2021-12-15"

Temel R POSIXt sınıfları, saat dilimlerini kontrol ederek tarih ve saatlere izin verir. R’de kullanılabilen iki POSIXt alt sınıfı vardır: POSIXct ve POSIXlt. POSIXct sınıfı, GMT (UTC – evrensel saat, koordineli) 1970-01-01 gece yarısından bu yana işaretli saniye sayısı olarak tarih-saat değerlerini temsil eder. POSIXlt sınıfı, tarih-saat değerlerini, saniye (sn), dakika (dk), saat (saat), ayın günü (mday), ay (mon), yıl (yıl), gün için öğeleri içeren adlandırılmış bir liste olarak temsil eder.

Tarih-saatleri temsil eden en yaygın format kodları seti, strptime() işlevinin yardım dosyasında listelenmiştir (konsolunuza help(strptime) yazın).

Sys.time()
[1] "2024-04-22 11:12:55 +03"
class(Sys.time())
[1] "POSIXct" "POSIXt" 
myDateTime <- "2021-12-11 22:10:35"
myDateTime
[1] "2021-12-11 22:10:35"
class(myDateTime)
[1] "character"
as.POSIXct(myDateTime)
[1] "2021-12-11 22:10:35 +03"
class(as.POSIXct(myDateTime))
[1] "POSIXct" "POSIXt" 
Sys.timezone()
[1] "Europe/Istanbul"
as.POSIXct("30-12-2021 23:25", format = "%d-%m-%Y %H:%M")
[1] "2021-12-30 23:25:00 +03"
myDateTime.POSIXlt <- as.POSIXlt(myDateTime)

# seconds
myDateTime.POSIXlt$sec
[1] 35
# minutes
myDateTime.POSIXlt$min
[1] 10
# hours
myDateTime.POSIXlt$hour
[1] 22
# POSIXt nesneleri tarih formatına dönüştürülebilir.
as.Date(myDateTime.POSIXlt)
[1] "2021-12-11"

lubridate paketi, R’de tarih ve saatlerle çalışmayı kolaylaştıran çeşitli işlevler sağlar. Lubridate paketi, ymd(), ymd_hms(),dmy(), dmy_hms(),mdy()gibi işlevler sağlayarak tarih-zamanların ayrıştırılmasını kolay ve hızlı hale getirir.

library(lubridate)

Attaching package: 'lubridate'
The following objects are masked from 'package:base':

    date, intersect, setdiff, union
# convert a number into a data object
ymd(20211215) # year-month-date
[1] "2021-12-15"
ymd_hm(202112121533) # year-month-date-hour-minute
[1] "2021-12-12 15:33:00 UTC"
mdy("Aralık 13, 2021") # month date year
[1] "2021-12-13"
mdy("12 18, 2021") # month date year
[1] "2021-12-18"
dmy(241221) # day-month-year
[1] "2021-12-24"
dmy(24122021) # day-month-year
[1] "2021-12-24"
today <- Sys.time()
today
[1] "2024-04-22 11:12:55 +03"
year(today) # year
[1] 2024
month(today) # month
[1] 4
month(today, label = TRUE) # labeled month
[1] Nis
12 Levels: Oca < Şub < Mar < Nis < May < Haz < Tem < Ağu < Eyl < ... < Ara
month(today,label = TRUE, abbr = FALSE) # labeled month
[1] Nisan
12 Levels: Ocak < Şubat < Mart < Nisan < Mayıs < Haziran < ... < Aralık
week(today) # week
[1] 17
mday(today) # day
[1] 22
wday(today) # weekday
[1] 2
wday(today, label = TRUE) # labeled weekday
[1] Pzt
Levels: Paz < Pzt < Sal < Çar < Per < Cum < Cmt
wday(today, label = TRUE, abbr = FALSE) # labeled weekday
[1] Pazartesi
7 Levels: Pazar < Pazartesi < Salı < Çarşamba < Perşembe < ... < Cumartesi
yday(today) # day of the year
[1] 113
hour(today) # hour
[1] 11
minute(today) # minute
[1] 12
second(today) # second
[1] 55.7026

Yukarıda listelenen çeşitli işlevlere ek olarak, zoo paketindeki as.yearmon() ve as.yearqtr() işlevleri, düzenli aralıklarla aylık ve üç aylık verilerle çalışırken uygundur.

library(zoo)

Attaching package: 'zoo'
The following objects are masked from 'package:base':

    as.Date, as.Date.numeric
as.yearmon(today)
[1] "Nis 2024"
format(as.yearmon(today), "%B %Y")
[1] "Nisan 2024"
format(as.yearmon(today), "%Y-%m")
[1] "2024-04"
as.yearqtr(today)
[1] "2024 Q2"
# dataframe içerisinde tarih kullanmak
df <-
  data.frame(date = c(
    "2010-02-01",
    "20110522",
    "2009/04/30",
    "2012 11 05",
    "11-9-2015"
  ))

df$date2 <- as.Date(parse_date_time(df$date, c("ymd", "mdy")))            
df
        date      date2
1 2010-02-01 2010-02-01
2   20110522 2011-05-22
3 2009/04/30 2009-04-30
4 2012 11 05 2012-11-05
5  11-9-2015 2015-11-09