תאריך ב-R הוא ספירת ימים בתחפושת
כדי להפוך מחרוזת לתאריך אמיתי, השתמשו ב-as.Date(); כדי לקבל את היום, השתמשו ב-Sys.Date(). מאחורי שתיהן עומד טריק פשוט: המחלקה Date של R היא בסך הכול מספר, ספירת הימים מאז 1 בינואר 1970, עם תחפושת שגורמת לו להיות מודפס כמו תאריך בלוח השנה. אפשר להוריד את התחפושת עם unclass():
ה-20672 הזה הוא ספירת הימים הגולמית, והוא מה שגורם לכל השאר בעמוד הזה לעבוד: השוואות, חיסור ורצפים הם כולם חשבון של מספרים שלמים מתחת לפני השטח. התחפושת היא מה שהופך אותו לשימושי: אותו מספר מודפס כתאריך, מעוצב כתאריך ומשורטט על ציר תאריכים.
as.Date() מפענחת בשמחה את המבנה של ISO, "YYYY-MM-DD", בלי שום עזרה, וזו אחת מכמה סיבות טובות לשמור תאריכים כך בקבצים שלכם. הרגל אחד שכדאי לפתח מוקדם: פענוח שנכשל מחזיר NA בשקט, לא שגיאה, אז תמיד העיפו מבט בתוצאה אחרי שאתם מפענחים משהו חדש.
מחרוזות שרק נראות כמו תאריכים הן עדיין מחרוזות בלבד: "2026-08-07" < "2026-11-01" במקרה משווה נכון כי הסדר של ISO תואם לסדר האלפביתי, אבל "07/08/2026" ממוין בצורה חסרת היגיון. המירו קודם, ואז השוו.
פענוח מבנים אחרים עם format =
העולם לא כותב תאריכים ב-ISO. לכל השאר, as.Date() מקבלת ארגומנט format =: מתכון שמתאר את המחרוזת הנכנסת, בנוי מקודי %.
שלושתם מפוענחים לאותו יום. המתכון חייב להתאים למחרוזת בדיוק, כולל התווים המפרידים: "%d/%m/%Y" לא יפענח את "07-08-2026". הקודים שבאמת תשתמשו בהם:
| קוד | משמעות | דוגמה |
|---|---|---|
%Y | שנה בת 4 ספרות | 2026 |
%y | שנה בת 2 ספרות | 26 |
%m | מספר החודש | 08 |
%d | היום בחודש | 07 |
%b | שם חודש מקוצר | Aug |
%B | שם חודש מלא | August |
%a | יום בשבוע מקוצר | Fri |
%A | יום בשבוע מלא | Friday |
%H | שעה (00-23) | 14 |
%M | דקה | 30 |
%S | שנייה | 05 |
המארב הקלאסי הוא "07/08/2026" עצמו: יום/חודש/שנה ברוב העולם, חודש/יום/שנה בארצות הברית, ו-R לא יכולה לנחש לאיזה מהם הקובץ שלכם מתכוון. גרוע מזה, ניחוש שגוי לעיתים קרובות "עובד", כי שתי הקריאות הן תאריכים תקינים, עד שמגיע יום 13 של חודש כלשהו ומפוענח ל-NA (אין חודש 13). הכירו את המוסכמה של הנתונים שלכם לפני שאתם כותבים את המתכון.
עיצוב תאריכים לפלט
format() היא תמונת המראה של as.Date(): אותם קודי %, בכיוון ההפוך: Date נכנס, מחרוזת יוצאת.
השתמשו בזה לכותרות של דוחות, לתוויות ולשמות קבצים: format(Sys.Date(), "%Y-%m-%d") יוצר שמות שממוינים לפי סדר כרונולוגי. שני פרטים שכדאי להכיר: %d מוסיף אפס מוביל ("August 07"), ו-%B/%A מפיקים שמות לפי הגדרות השפה של המערכת שלכם: סשן שמוגדר לגרמנית מדפיס "Freitag" במקום "Friday". השאירו את העיצוב בקצוות של הסקריפט, בשביל בני אדם; בפנים, השאירו תאריכים כ-Dates.
חשבון תאריכים ורצפים
מכיוון ש-Date הוא ספירת ימים, חשבון עובד כמו שהייתם מקווים. חיסור של שני תאריכים נותן אובייקט difftime:
שלושה הרגלים שכדאי לקחת מהבלוק הזה. ראשית, עטפו difftime ב-as.numeric() לפני שאתם מחשבים איתו: ל-difftime יש מאפיין יחידות שיכול להפתיע חישובים מאוחרים יותר. שנית, כשהיחידות חשובות, ציינו אותן עם difftime(units = ) במקום לקבל את מה ש-R בוחרת. שלישית, הוספת מספר רגיל פירושה הוספת ימים: אין + 1 month ב-base R, כי "חודש אחד" אינו מספר קבוע של ימים.
לצעדים שמודעים ללוח השנה, השתמשו ב-seq(), שמבינה "day", "week", "month", "quarter" ו-"year":
רצפים חודשיים הם הכלי הסטנדרטי לתקופות דיווח ולחלוקות ציר. מוזרות אחת: התחילו רצף חודשי ב-31 בחודש, ו-R תמשיך לספור ימים אמיתיים דרך חודשים שאין להם יום כזה, כך שהערך של "פברואר" נוחת בתחילת מרץ. עגנו רצפים חודשיים ב-1 בחודש וגזרו כל דבר אחר משם.
חילוץ חלקים של תאריך
ב-base R יש שתי פונקציות חילוץ נוחות וביטוי כללי אחד. weekdays() ו-months() מחזירות שמות; למספרים, עשו סיבוב דרך format():
המהלך של format() ואז as.integer() נראה עקיף, אבל זה הביטוי הסטנדרטי ב-base R, והוא וקטורי: העבירו לו עמודה שלמה של תאריכים ותקבלו בחזרה עמודה שלמה של שנים. זה בדיוק מה שאתם רוצים אחרי ייבוא מערך נתונים עם תאריכים מקובץ CSV: פענחו את עמודת התאריך פעם אחת עם as.Date(), ואז גזרו עמודות של שנה וחודש לצורך קיבוץ.
כשימים לא מספיקים: POSIXct ו-lubridate
ל-Date אין שום מושג של שעות. ברגע שבנתונים שלכם יש חותמות זמן, רשומות לוג, קריאות חיישנים, "ההזמנה בוצעה ב-14:32", אתם צריכים POSIXct, המחלקה של R לתאריך ושעה: שניות מאז 1970 במקום ימים, ומודעת לאזורי זמן.
הכול עובר: אותם קודי % (עכשיו כולל %H, %M, %S) עובדים לפענוח ול-format(), חיסור נותן difftimes, ו-Sys.time() הוא "עכשיו". הנטל החדש הוא אזור הזמן: העבירו tz = במפורש בזמן הפענוח, כי אחרת שני סשנים באזורים שונים יקראו את אותה מחרוזת כשני רגעים שונים. והתאפקו מלאחסן נתוני לוח שנה כ-POSIXct "ליתר ביטחון": יום הולדת שמאוחסן כחצות באזור זמן מסוים יכול להיות מודפס כיום הקודם באזור אחר, באג אומלל באמת למעקב. ימים שלמים: Date. רגעים: POSIXct.
לבסוף, החבילה lubridate היא הפנים הידידותיות יותר שרוב הקוד של ה-tidyverse שם על כל מה שלמעלה, ושווה לאמץ אותה ברגע שהמנגנונים הבסיסיים מובנים:
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() ו-dmy() מחליפות מתכוני פורמט בהצהרה פשוטה על סדר החלקים, ו-floor_date() פותרת את "קבצו את חותמות הזמן האלה לפי חודש" בקריאה אחת. lubridate נשענת על אותן מחלקות Date/POSIXct מתחת: הגה טוב יותר, לא מנוע אחר.
מה לקחת מכאן
Dateהוא ספירת ימים מאז 1970-01-01 שמחופשת כדי להיות מודפסת כמו תאריך;unclass()מראה את המספר.as.Date("2026-08-07")מפענחת ISO ישירות; כל דבר אחר צריך מתכוןformat =של קודי%, ופענוח שנכשל מחזירNA, בשקט.format(date, "...")היא הכיוון ההפוך: אותם קודים, שמפיקים מחרוזות לתצוגה.- חיסור נותן difftime: הגדירו
units =במפורש, והפעילוas.numeric()לפני חישובים.+ nמוסיף ימים; לחודשים, השתמשו ב-seq(by = "month"). weekdays(),months()והביטויas.integer(format(...))שולפים חלקים, באופן וקטורי.Dateלימים שלמים,POSIXct(עםtzמפורש) לחותמות זמן; lubridate הופכת את שניהם לידידותיים יותר.
הבא בתור: מה לעשות כש-R צועקת עליכם: קריאת הודעות שגיאה וניפוי שלהן בשיטתיות.
שאלות נפוצות
איך ממירים מחרוזת לתאריך ב-R?
עם as.Date(). אם המחרוזת בפורמט ISO זה פשוט עובד: as.Date("2026-08-07"). כל מבנה אחר צריך מתכון format = שבנוי מקודי %: as.Date("07/08/2026", format = "%d/%m/%Y"). פענוח שנכשל מחזיר NA ולא שגיאה, אז בדקו את התוצאה.
איך מקבלים את התאריך של היום ב-R?
Sys.Date() מחזירה את היום כאובייקט Date; Sys.time() מחזירה את התאריך והשעה הנוכחיים כ-POSIXct. שתיהן לוקחות את הערך מהשעון של המחשב שלכם ומהגדרות אזור הזמן.
איך מחשבים את ההפרש בין שני תאריכים ב-R?
מחסירים אותם: as.Date("2026-08-07") - as.Date("2026-01-01") נותן difftime של 218 ימים. עטפו אותו ב-as.numeric() כדי להשתמש במספר בחישובים, או קראו ל-difftime(d1, d2, units = "weeks") כדי לבחור את היחידות בעצמכם במקום לתת ל-R לבחור.
מה ההבדל בין Date ל-POSIXct ב-R?
Date מאחסן ימים שלמים (בפנים: ימים מאז 1970-01-01) ולא יודע דבר על שעות או על אזורי זמן. POSIXct מאחסן רגע בזמן (שניות מאז 1970) ומודע לאזורי זמן. השתמשו ב-Date לנתוני לוח שנה כמו ימי הולדת ומועדי הגשה; השתמשו ב-POSIXct רק כשהשעה ביום חשובה, כמו חותמות זמן ולוגים.