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:
| Kod | Anlamı | Örnek |
|---|---|---|
%Y | 4 haneli yıl | 2026 |
%y | 2 haneli yıl | 26 |
%m | Ay numarası | 08 |
%d | Ayın günü | 07 |
%b | Kısaltılmış ay adı | Aug |
%B | Tam ay adı | August |
%a | Kısaltılmış gün adı | Fri |
%A | Tam gün adı | Friday |
%H | Saat (00-23) | 14 |
%M | Dakika | 30 |
%S | Saniye | 05 |
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 birformat =tarifi ister - ve başarısız bir ayrıştırma sessizceNAdö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 önceas.numeric()uygulayın.+ ngün ekler; aylar içinseq(by = "month")kullanın. weekdays(),months()veas.integer(format(...))deyimi parçaları vektörleştirilmiş biçimde çıkarır.- Tam günler için
Date, zaman damgaları için (açık birtzile)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.