Menu

R'de Tarihler: as.Date, format() ve Tarih Aritmetiği

R'nin Date sınıfı, kostüm giymiş bir gün sayacıdır. as.Date ile metinleri ayrıştırma, çıktı için tarih biçimlendirme, çıkarma işlemi, dizi oluşturma ve bunun yerine POSIXct'e ne zaman ihtiyaç duyduğunuz.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

R'de Bir Tarih, Kostüm Giymiş Bir Gün Sayacıdır

Bir metni gerçek bir tarihe çevirmek için as.Date(), bugünü almak için Sys.Date() kullanın. İkisinin de arkasında basit bir hile vardır: R'nin Date sınıfı yalnızca bir sayıdır - 1 Ocak 1970'ten beri geçen gün sayısı - üzerine geçirilmiş bir kostümle takvim tarihi gibi yazdırılır. Kostümü unclass() ile çıkarabilirsiniz:

O 20672 ham gün sayısıdır ve bu sayfadaki diğer her şeyi çalıştıran şey odur: karşılaştırmalar, çıkarma ve diziler altta yalnızca tam sayı matematiğidir. Kostüm ise onu kullanılabilir kılan şeydir - aynı sayı bir tarih olarak yazdırılır, bir tarih olarak biçimlenir ve bir tarih ekseninde çizilir.

as.Date(), "YYYY-MM-DD" ISO düzenini yardım almadan seve seve ayrıştırır; tarihleri dosyalarınızda böyle saklamanız için birkaç iyi nedenden biri budur. Erkenden edinilecek bir alışkanlık: başarısız bir ayrıştırma hata değil, sessizce NA döndürür - o yüzden yeni bir şey ayrıştırdıktan sonra sonuca her zaman göz atın.

Yalnızca tarihe benzeyen metinler hâlâ birer metindir: "2026-08-07" < "2026-11-01" doğru karşılaştırılır, çünkü ISO sırası alfabetik sırayla örtüşür; ama "07/08/2026" saçma sıralanır. Önce dönüştürün, sonra karşılaştırın.

format = ile Diğer Düzenleri Ayrıştırma

Dünya ISO tarihleri yazmaz. Diğer her şey için as.Date() bir format = argümanı alır: gelen metni tarif eden, % kodlarından kurulmuş bir tarif.

Üçü de aynı güne ayrışır. Tarif, ayırıcılar dahil metinle birebir eşleşmelidir: "%d/%m/%Y", "07-08-2026" ifadesini ayrıştıramaz. Gerçekten kullanacağınız kodlar:

KodAnlamıÖrnek
%Y4 haneli yıl2026
%y2 haneli yıl26
%mAy numarası08
%dAyın günü07
%bKısaltılmış ay adıAug
%BTam ay adıAugust
%aKısaltılmış gün adıFri
%ATam gün adıFriday
%HSaat (00-23)14
%MDakika30
%SSaniye05

Klasik pusu "07/08/2026" ifadesinin kendisidir: dünyanın çoğunda gün/ay/yıl, ABD'de ay/gün/yıl ve R dosyanızın hangisini kastettiğini tahmin edemez. Daha kötüsü, yanlış bir tahmin çoğu zaman "işe yarar" - her iki okuma da geçerli tarihlerdir - ta ki bir ayın 13'ü gelip NA olarak ayrışana kadar (13. ay yoktur). Tarifi yazmadan önce verinizin geleneğini bilin.

Çıktı İçin Tarih Biçimlendirme

format(), as.Date() fonksiyonunun ayna görüntüsüdür: aynı % kodları, ters yönde çalışır - Date girer, metin çıkar.

Bunu rapor başlıkları, etiketler ve dosya adları için kullanın - format(Sys.Date(), "%Y-%m-%d") kronolojik sıralanan isimler üretir. Bilmeye değer iki ayrıntı: %d sıfırla doldurur ("August 07") ve %B/%A, sisteminizin dil ayarlarındaki isimleri üretir - Almanca yapılandırılmış bir oturum "Friday" yerine "Freitag" yazdırır. Biçimlendirmeyi betiğinizin kenarlarında, insanlar için tutun; içeride tarihleri Date olarak bırakın.

Tarih Aritmetiği ve Diziler

Bir Date bir gün sayacı olduğu için aritmetik umduğunuz gibi çalışır. İki tarihi çıkarmak bir difftime nesnesi verir:

O bloktan çıkarılacak üç alışkanlık. Birincisi, bir difftime ile matematik yapmadan önce onu as.numeric() içine sarın - difftime, sonraki hesapları şaşırtabilecek bir birim özniteliği taşır. İkincisi, birimler önem taşıdığında R'nin seçtiğini kabul etmek yerine onları difftime(units = ) ile belirtin. Üçüncüsü, düz bir sayı eklemek gün eklemek demektir - temel R'de + 1 ay yoktur, çünkü "bir ay" sabit sayıda gün değildir.

Takvim farkındalıklı adımlama için "day", "week", "month", "quarter" ve "year" anlayan seq() kullanın:

Aylık diziler, rapor dönemleri ve eksen aralıkları için standart araçtır. Bir tuhaflık: aylık bir diziyi ayın 31'inde başlatın; R o güne sahip olmayan aylar boyunca gerçek günleri saymaya devam eder ve "Şubat" girdisi mart başına düşer. Aylık dizileri ayın 1'ine sabitleyin ve diğer her şeyi oradan türetin.

Bir Tarihin Parçalarını Çıkarma

Temel R'nin iki kolaylık çıkarıcısı ve bir genel deyimi vardır. weekdays() ve months() isimleri döndürür; sayılar için format() üzerinden gidip gelin:

format()-sonra-as.integer() hamlesi dolambaçlı görünür, ama standart temel R deyimidir ve vektörleştirilmiştir - ona bütün bir tarih sütunu verin, bütün bir yıl sütunu geri alın. Tarihli bir veri kümesini bir CSV dosyasından içe aktardıktan sonra tam olarak istediğiniz şey budur: tarih sütununu as.Date() ile bir kez ayrıştırın, sonra gruplama için yıl ve ay sütunları türetin.

Günler Yetmediğinde: POSIXct ve lubridate

Date fonksiyonunun saat kavramı yoktur. Verinizde zaman damgaları olduğu an - günlük kayıtları, sensör ölçümleri, "sipariş 14:32'de verildi" - R'nin tarih-saat sınıfı olan POSIXct gerekir: gün yerine 1970'ten beri geçen saniyeler ve saat dilimi farkındalığı.

Her şey aktarılır: aynı % kodları (artık %H, %M, %S dahil) ayrıştırma ve format() için çalışır, çıkarma difftime verir, Sys.time() "şimdi"dir. Yeni yük saat dilimidir - ayrıştırırken tz = argümanını açıkça geçirin, çünkü aksi hâlde farklı dilimlerdeki iki oturum aynı metni iki farklı an olarak okur. Ve takvim verilerini "ne olur ne olmaz" diye POSIXct olarak saklamaya direnin: bir dilimdeki gece yarısı olarak saklanan bir doğum günü başka bir dilimde önceki gün olarak yazdırılabilir; izini sürmesi gerçekten can sıkıcı bir hata. Tam günler: Date. Anlar: POSIXct.

Son olarak lubridate paketi, çoğu tidyverse kodunun yukarıdaki her şeye geçirdiği daha dostane yüzdür - temel mekanikler oturduğunda benimsemeye değer:

library(lubridate)

ymd("2026-08-07")            # order-based parsing: no format string
mdy("08/07/2026")            # ...you just say which order the parts come in
dmy("7 August 2026")
floor_date(Sys.Date(), "month")   # snap to the start of the period

ymd(), mdy() ve dmy(), format tariflerinin yerine parçaların hangi sırada geldiğine dair basit bir bildirim koyar ve floor_date(), "bu zaman damgalarını aya göre grupla" işini tek çağrıda çözer. lubridate altta aynı Date/POSIXct sınıflarına biner - farklı bir motor değil, daha iyi bir direksiyon.

Buradan Ne Çıkarıyorsunuz

  • Bir Date, tarih gibi yazdırılmak üzere giydirilmiş, 1970-01-01'den beri geçen gün sayısıdır; unclass() sayıyı gösterir.
  • as.Date("2026-08-07") ISO'yu doğrudan ayrıştırır; diğer her şey % kodlarından oluşan bir format = tarifi ister - ve başarısız bir ayrıştırma sessizce NA döndürür.
  • format(date, "...") tersidir: aynı kodlar, görüntüleme metinleri üretir.
  • Çıkarma bir difftime verir - units = değerini açıkça ayarlayın, matematikten önce as.numeric() uygulayın. + n gün ekler; aylar için seq(by = "month") kullanın.
  • weekdays(), months() ve as.integer(format(...)) deyimi parçaları vektörleştirilmiş biçimde çıkarır.
  • Tam günler için Date, zaman damgaları için (açık bir tz ile) POSIXct; lubridate ikisini de dostane kılar.

Sırada: R size bağırdığında ne yapmalı - hata mesajlarını okumak ve onları yöntemli biçimde ayıklamak.

Sıkça Sorulan Sorular

R'de bir metin tarihe nasıl dönüştürülür?

as.Date() ile. Metin ISO biçimindeyse doğrudan çalışır: as.Date("2026-08-07"). Diğer her düzen, % kodlarından kurulmuş bir format = tarifi ister: as.Date("07/08/2026", format = "%d/%m/%Y"). Başarısız bir ayrıştırma hata değil NA döndürür, dolayısıyla sonucu kontrol edin.

R'de bugünün tarihi nasıl alınır?

Sys.Date() bugünü bir Date nesnesi olarak döndürür; Sys.time() mevcut tarih-saati bir POSIXct olarak döndürür. İkisi de bilgisayarınızın saat ve saat dilimi ayarlarından gelir.

R'de iki tarih arasındaki fark nasıl hesaplanır?

Onları çıkarın: as.Date("2026-08-07") - as.Date("2026-01-01") 218 günlük bir difftime verir. Sayıyı matematikte kullanmak için onu as.numeric() içine sarın ya da birimleri R'nin seçmesine bırakmak yerine kendiniz belirlemek için difftime(d1, d2, units = "weeks") çağırın.

R'de Date ile POSIXct arasındaki fark nedir?

Date tam günleri saklar (içeride: 1970-01-01'den beri geçen günler) ve saatlerden ya da saat dilimlerinden habersizdir. POSIXct ise zamandaki bir anı saklar (1970'ten beri geçen saniyeler) ve saat dilimi farkındadır. Doğum günleri ve son tarihler gibi takvim verileri için Date, zaman damgaları ve günlükler gibi günün saati önem taşıdığında POSIXct kullanın.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA