עבודה עם תאריכים בפייתון

מחבר:
בתאריך:

ישנם כמה ספריות לעבודה עם זמנים בפייתון. במדריך זה נכיר את הספריות החשובות ביותר.

עבודה עם תאריכים בפייתון

 

המודול 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:', today.month)
month: 11
print('day:', today.day)
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'

dt = datetime.strptime(str, '%d-%m-%Y')

print(dt)
2019-07-31 00:00:00

הפונקציה 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
  1. הגדרנו את אזור הזמן
  2. הפכנו את התאריך dt למודע לזמן.

לכל המדריכים בסדרה ללימוד פייתון

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

 

הוסף תגובה חדשה

 

= 4 + 7