Menu

תאריכים ב-R: as.Date, format() וחשבון תאריכים

המחלקה Date של R היא ספירת ימים בתחפושת. איך מפענחים מחרוזות עם as.Date, מעצבים תאריכים לפלט, מחסירים אותם, בונים רצפים, ומתי צריך POSIXct במקום.

בדף הזה יש עורכים שאפשר להריץ. לערוך, להריץ ולראות את הפלט מיד.

תאריך ב-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 רק כשהשעה ביום חשובה, כמו חותמות זמן ולוגים.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל