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

להתחיל