עבודה עם תאריכים בפייתון
ישנם כמה ספריות לעבודה עם זמנים בפייתון. במדריך זה נכיר את הספריות החשובות ביותר.
המודול datetime
המודול datetime כולל מספר ספריות לטיפול בזמנים: date, datetime ו-timedelta.
זו לא טעות. בתוך המודול datetime ישנה ספרייה ששמה גם הוא datetime.
איך לייבא את ספריות datetime?
אפשר לייבא ספרייה אחת מהמודול datetime, לדוגמה:
from datetime import date
או כמה ספריות במכה אחת:
from datetime import date, datetime, timedelta
ההבדל בין הספריות date ו-datetime
לספריות של datetime יש מתודות שאיתם אנחנו עובדים. לדוגמה, מתודות שנותנות לנו את התאריך ברגע זה:
today = date.today()
now = datetime.now()
שמות המתודות שונות בין הספריות. התוצאות גם הם שונות:
print(today)
2019-11-22
print(now)
2019-11-22 18:40:00.196096
- ספריית datetime.date עובדת עם תאריכים הכוללים שנה, חודש ויום.
- בעוד datetime.datetime עובדת עם כל הטווח, כולל שעה יום שנייה ומיקרו-שנייה (מילונית השנייה).
- בדרך כלל, נשתמש בספריית datetime.datetime.
ניתן לגשת לרכיבי התאריך באופן פשוט.
עבור date:
print('year:', today.year)
year: 2019
print('month:', f"{today.month:02}")
month: 11
- השימוש בf-string מיועד להבטיח ריפוד באפסים עד לאורך 2 תווים. בהתאם ערך בן ספרה בודדת, דוגמת 1 יוצג כ-01
print('day:', f"{today.day:02}")
day: 22
עבור datetime קיימות אפשרויות נוספות:
now.year
now.month
now.day
now.hour
now.minute
now.second
now.microsecond
מתודה מעניינת נוספת של datetime מציגה את היום בשבוע באמצעות מספר סודר (אינדקס):
print(now.weekday())
# 4 - Friday 0 - monday, # 6 - sunday
- שימו לב, השבוע בפייתון מתחיל ביום שני (אינדקס 0) ומסתיים בראשון (אינדקס 6).
הגדרת תאריכים
כדי להגדיר תאריך אנחנו צריכים להעביר את הרכיבים שלו לתוך הקונסטרקטור.
from datetime import date, datetime
d1 = date(2016, 4, 15)
print(d1) # 2016-04-15
d2 = datetime(2016, 4, 15)
print(d2) # 2016-04-15 00:00:00
- הזמן שנותן אובייקט הספרייה datetime הוא מדויק יותר מזה שנותן אובייקט של date מפני שהוא כולל שעות, דקות ושניות.
כשאנחנו עובדים עם datetime אנחנו יכולים להגדיר גם את השעה, הדקה והשנייה:
d2 = datetime(2016, 4, 15, 14, 35, 8)
print(d2) # 2016-04-15 14:35:08
הצגה של תאריכים בפורמטים שונים
נעזר במתודה-strftime כדי להציג את התאריכים בפורמטים שונים.
נגדיר את התאריך כתנאי מקדים:
from datetime import date, datetime
d = datetime(2019, 8, 26, 15, 30, 45, 950)
נעזר ב-strftime לקבלת שמות הימים:
print(d.strftime('%a')) # Sun, Mon
print(d.strftime('%A')) # Sunday, Monday
שמות החודשים:
print(d.strftime('%b')) # Jan, Feb
print(d.strftime('%B')) # January, February
print(d.strftime('%m')) # Month as a zero-padded decimal number. 01, 02 .. 12
הצגת התאריך בפורמט המקובל בישראל (יום, תאריך ורק אז שנה):
str = d.strftime('%d-%m-%Y, %H:%M:%S')
print(str)
26-08-2019, 15:30:45
קיימות אפשרויות נוספות המתועדות בדף הרשמי של פייתון
שימו לב, הפונקציה strftime הופכת משתנה מסוג datetime למחרוזת:
print(type(str))
class 'str'
הפיכת מחרוזות לתאריכים
ניתן להמיר מחרוזות שמבטאות תאריכים לאובייקטים של datetime באמצעות המתודה strptime. לדוגמה:
from datetime import datetime
str = '31-07-2019 08:03:05'
dt = datetime.strptime(str, '%d-%m-%Y %H:%M:%S')
print(dt)
2019-07-31 08:03:05
הפונקציה strptime מקבלת את פורמט התאריך בתור פרמטר שני.
השוואה בין תאריכים
אפשר להשוות בין תאריכים ולברר האם תאריך מסוים הוא גדול, קטן או שווה לתאריך אחר. נתחיל בהגדרת שני תאריכים:
from datetime import date
d1 = date.today()
d2 = date(2016, 4, 15)
האם d1 גדול מ-d2?
print(d1 > d2) # True
האם d1 שווה ל-d2?
print(d1 == d2) # False
האם d1 קטן מ-d2?
print(d1 < d2) # False
הפרש בין תאריכים
ניתן להפחית תאריך אחד מאחר.
from datetime import date
d1 = date.today()
d2 = date(2016, 4, 15)
delta = d1 - d2
print(delta)
1316 days, 0:00:00
הפרש בין תאריכים יוצר סוג נתונים מיוחד. אובייקט מסוג timedelta.
print(type(delta))
datetime.timedelta
אובייקט timedelta מאפשר לנו להוסיף או להפחית זמנים מתאריך נתון.
לדוגמה, להוסיף או להפחית 7 ימים מתאריך.
from datetime import datetime, timedelta
today = datetime.today()
delta = timedelta(days=7)
נוסיף את delta:
print(today + delta)
2019-11-29 18:54:15.956464
נפחית את delta:
print(today - delta)
2019-11-15 18:54:48.578443
כמה שניות יש ב-delta?
print(delta.total_seconds())
604800.0
timedelta יכול להועיל לנו בחישוב הזמן לתאריך מסוים. לדוגמה, הזמן שנותר עד לסוף השנה:
# time to event with delta
today = datetime.today()
the_event = datetime(2019, 12, 31)
delta = the_event - today
print('time to the event: {}'.format(delta))
print('{} days to the event'.format(delta.days))
time to the event: 38 days, 5:03:43.485745 38 days to the event
עבודה עם תאריך Unix
time הוא מודול בפני עצמו שלא שייך ל- datetime. נשתמש במודל time כדי לעבוד מול מערכות הפעלה. המודול time עובד עם חותמת זמן שסופרת את הזמן מאז ה-epoch בתאריך 1 בינואר 1970.
נייבא את המודול:
import time
מה זמן ה-epoch עכשיו?
ts = time.time() # the timestamp now
print(ts)
1574449040.248941
הזמן כולל ספרות עשרוניות כי הוא מדויק עד לרמה של מיקרו-שניות (מיליוניות השנייה).
נדפיס את התאריך עכשיו על פי הפורמט מערכת ההפעלה:
print(time.ctime(ts))
Fri Nov 22 18:58:07 2019
- הפורמט אצלכם במערכת עשוי להיות שונה מזה שאצלי.
הפונקציה הזו שימושית במיוחד כשאנחנו רוצים למדוד את משך הזמן שתהליך או פונקציה רצים:
import time
# time that a process takes to run
start = time.process_time()
# the process ...
for i in range(100):
continue
end = time.process_time()
delta = end - start
print('Process took {}'.format(delta))
Process took 7.9370000000044665e-06
התהליך רץ במשך 7.9 מיקרו שניות.
- המשתנה delta הוא ההפרש בין זמן ההתחלה והסיום המודד את משך התהליך במיקרו-שניות.
- ניתן למדוד את המשך של כל תהליך או פונקציה.
- קיימות שיטות אחרות אבל פייתון ממליץ על שימוש במודול-time.
עבודה עם אזורי זמן
כדי לעבוד עם אזורי זמן נתקין את המודול pytz.
את pytz נתקין עם מתקין החבילות pip באמצעות הרצת השורה הבאה בטרמינל:
pip install pytz
נייבא את הספריות הדרושות שלנו לדוגמה:
# pytz - working with timezones (tz)
from datetime import datetime
import pytz
נהפוך את התאריך הסטנדרטי לתאריך שמודע לאזורי זמן באמצעות העברת פרמטר tzinfo
# make the object timezone aware by passing a tzinfo parameter
dt = datetime(2019, 8, 26, 15, 25, 40, 950, tzinfo=pytz.UTC)
print(dt)
2019-08-26 15:25:40.000950+00:00
- tzinfo=pytz.UTC מגדיר את התאריך על הזמן הסטנדרטי המשותף לכל העולם.
- התוספת +00:00 משתנה בהתאם לאזור הזמן
כדי להפוך את המתודות של datetime למודעות לאזור זמן נעביר להם את הפרמטר tz:
dt_utcnow = datetime.now(tz=pytz.UTC)
print(dt_utcnow)
2019-11-22 19:00:41.647333+00:00
נמיר את התאריך לאזור הזמן של ישראל Asia/Jerusalem
# convert from UTC to a different timezone
dt_israel = dt_utcnow.astimezone(pytz.timezone('Asia/Jerusalem'))
print(dt_israel)
2019-11-22 21:01:15.325644+02:00
+02:00 ההפרש הוא בין אזור הזמן בישראל לבין UTC.
את רשימת אזורי הזמן ניתן למצוא בתיעוד של pytz.
מה שעשינו הוא להמיר תאריך מודע לזמן (UTCׂ) לתאריך אחר שמודע לזמן ישראל. אבל כיצד נמיר את תאריך נאיבי, שלא מודע לאזור זמן, לתאריך מודע?
נגדיר את התאריך עכשיו:
dt = datetime.now() # nvaive datetime
המשתנה אינו מודע לאזור הזמן. הקוד הבא יהפוך אותו למודע:
# define the timezone
il_tz = pytz.timezone('Asia/Jerusalem')
# now the object is timezone aware
dt_il = il_tz.localize(dt)
print(dt_il)
2019-11-22 19:03:04.616397+02:00
- הגדרנו את אזור הזמן
- הפכנו את התאריך dt למודע לזמן.
לכל המדריכים בסדרה ללימוד פייתון
אהבתם? לא אהבתם? דרגו!
0 הצבעות, ממוצע 0 מתוך 5 כוכבים
המדריכים באתר עוסקים בנושאי תכנות ופיתוח אישי. הקוד שמוצג משמש להדגמה ולצרכי לימוד. התוכן והקוד המוצגים באתר נבדקו בקפידה ונמצאו תקינים. אבל ייתכן ששימוש במערכות שונות, דוגמת דפדפן או מערכת הפעלה שונה ולאור השינויים הטכנולוגיים התכופים בעולם שבו אנו חיים יגרום לתוצאות שונות מהמצופה. בכל מקרה, אין בעל האתר נושא באחריות לכל שיבוש או שימוש לא אחראי בתכנים הלימודיים באתר.
למרות האמור לעיל, ומתוך רצון טוב, אם נתקלת בקשיים ביישום הקוד באתר מפאת מה שנראה לך כשגיאה או כחוסר עקביות נא להשאיר תגובה עם פירוט הבעיה באזור התגובות בתחתית המדריכים. זה יכול לעזור למשתמשים אחרים שנתקלו באותה בעיה ואם אני רואה שהבעיה עקרונית אני עשוי לערוך התאמה במדריך או להסיר אותו כדי להימנע מהטעיית הציבור.
שימו לב! הסקריפטים במדריכים מיועדים למטרות לימוד בלבד. כשאתם עובדים על הפרויקטים שלכם אתם צריכים להשתמש בספריות וסביבות פיתוח מוכחות, מהירות ובטוחות.
המשתמש באתר צריך להיות מודע לכך שאם וכאשר הוא מפתח קוד בשביל פרויקט הוא חייב לשים לב ולהשתמש בסביבת הפיתוח המתאימה ביותר, הבטוחה ביותר, היעילה ביותר וכמובן שהוא צריך לבדוק את הקוד בהיבטים של יעילות ואבטחה. מי אמר שלהיות מפתח זו עבודה קלה ?
השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.