آموزش کار با کتابخانه datetime در پایتون

‏  10 دقیقه
۲۷ خرداد ۱۳۹۹
آموزش کار با کتابخانه datetime در پایتون

یکی از مهم‌ترین مزایای زبان برنامه‌نویسی پایتون، وجود داشتن کتابخانه‌های (ماژول‌ها) غنی و کاربردی در این زبان است. پایتون از معدود زبان‌های برنامه‌نویسی است که در هر زمینه‌ی کاری، کتابخانه‌ای مفید برای آن وجود دارد. یادگیری کتابخانه‌های مختلف پایتون، کمک شایان توجه‌ای در پیشرفت برنامه‌نویسی شما خواهد داشت. در این مقاله قصد داریم کار با کتابخانه datetime در پایتون را با چند برنامه‌ی مختلف، به شما آموزش دهیم. کتابخانه‌ی datetime یکی از کتابخانه‌های مهم پایتون، است. اگر علاقه‌مند به این موضوعات هستید، در ادامه با ما همراه باشید.

فهرست محتوای این مقاله

برنامه‌ی اول

برای اولین برنامه یک مثال ساده می‌آوریم و برنامه‌ای می‌نویسیم که تاریخ اکنون را به صورت مقادیر جداگانه سال، ماه، روز، ساعت، دقیقه و ثانیه دریافت کند و در پایان با سلیقه‌ی خود چاپ می‌کنیم.

برای شروع کار با کتابخانه datetime در پایتون برای این برنامه و سایر برنامه‌هایی که خواهیم نوشت، ابتدا باید با دستور import کتابخانه‌ی datetime را در ابتدای برنامه‌ها وارد ‌کنیم. به این صورت:

import datetime

در ادامه باید تاریخ اکنون را به دست آوریم. برای این منظور از تابع today() در کلاس datetime استفاده می‌کنیم. به این صورت:

import datetime

now = datetime.datetime.today()

...

حالا با استفاده از متغیر now تمامی محتویات آن را به صورت زیر، جداگانه دریافت می‌کنیم:

...

now = datetime.datetime.today()

mm = str(now.month)
dd = str(now.day)
yyyy = str(now.year)
hour = str(now.hour)
mi = str(now.minute)
ss = str(now.second)

...

هر کدام از متغیرهای بالا، به ترتیب معرف سال، ماه، روز، ساعت، دقیقه و ثانیه می‌شود. در انتها نیز با استفاده از دستور print خروجی مورد نظر خود را به چاپ می‌رسانیم.

print (mm + "/" + dd + "/" + yyyy + " " + hour + ":" + mi + ":" + ss)

برنامه کامل و یک جای ما به همراه خروجی آن، به صورت زیر است:

import datetime

now = datetime.datetime.today()

mm = str(now.month)
dd = str(now.day)
yyyy = str(now.year)
hour = str(now.hour)
mi = str(now.minute)
ss = str(now.second)

print (mm + "/" + dd + "/" + yyyy + " " + hour + ":" + mi + ":" + ss)

خروجی:

6/16/2020 12:23:27

در ادامه‌ی این مقاله خواهیم دید، چگونه با نوشتن یک خط کد، می‌توانیم خروجی مورد نظر خود را برای قالب تاریخ داشته باشیم.

برنامه دوم

اولین برنامه‌ی ما، برنامه‌ای خواهد بود که سن کاربر را از ورودی دریافت کرده و سال تولد او را به میلادی چاپ می‌کند.

کتابخانه‌ی datetime را در ابتدا وارد می‌کنیم.

import datetime

برای پیدا کردن سال تولد کاربر از روی سن او، باید سن را از سالی که در آن هستیم، کم کرده، تا سال تولد را به دست آوریم. در کتابخانه‌ی datetime، با استفاده از تابع now() در کلاس datetime آن، می‌توانیم تاریخ و ساعتی که در آن هستیم را بگیریم. پس در اینجا تاریخ و ساعت را در یک متغیر ذخیره می‌کنیم. این‌گونه:

import datetime

now = datetime.datetime.now()

...

اگر اکنون متغیر now را با دستور پرینت اجرا کنیم، خروجی ما به صورت زیر است:

 

2020-06-15 22:59:03.274304

ما به این تاریخ و ساعت کامل نیاز نداریم و فقط سال مورد نظر را باید داشته باشیم. برای این کار می‌توانیم با استفاده از صفت (attribute) year فقط سال را دریافت کنیم. پس در ادامه‌‌ی نوشتن برنامه، سن را از کاربر دریافت می‌کنیم. به این صورت:

import datetime

now = datetime.datetime.now()
age = float(input('What is your age? '))

...

اکنون فقط کافی است سالی که در آن هستیم را از سن کم کنیم تا سال تولد به دست آید. همان‌طور که گفتیم برای داشتن سال، از صفت year استفاده می‌کنیم. به این صورت:

...

year_born =  int(now.year - age)

...

در آخر برای چاپ جواب، باید متغیر year_born  را با استفاده از تابع print() در خروجی چاپ کنیم. به این شکل:

...

year_born =  int(now.year - age)
print ("Awesome! you were born in ", year_born)

کد کامل ما به صورت زیر است. اگر سن ورودی را 25 وارد کنیم، خروجی کد را در ادامه مشاهده کنید.

import datetime

now = datetime.datetime.now()
age = float(input('What is your age? '))

year_born =  int(now.year - age)
print ("Awesome! you were born in ", year_born)

خروجی:

What is your age? 25

Awesome! you were born in  1995

برنامه سوم

برای برنامه‌ی سوم برنامه‌ای خواهیم نوشت که تاریخ روز را به شکلی که دوست داریم، به نمایش می‌گذارد.

برای این برنامه نیز، کتابخانه‌ی datetime را در ابتدای کد وارد می‌کنیم. می‌توانیم با استفاده از دستور as نام کتابخانه را به شکل دلخواه خود در بیاوریم. به این صورت:

import datetime as dt

...

این بار با استفاده از تابع today() در کلاس date تاریخ روز را دریافت می‌کنیم.

import datetime as dt

today_date = dt.date.today()

...

اگر اکنون متغیر today_date را چاپ کنیم ، خروجی ما به صورت زیر است:

2020-06-16

همان‌طور که در برنامه اول وعده دادیم نوبت آن است که قالب دلخواه خروجی خود را بدون کد اضافه بنویسیم. برای این منظور که تاریخ را به شکل مورد نظر خود با یک خط کد، چاپ کنیم، از تابع strftime() کمک می‌گیریم. به این صورت:

print(today_date.strftime("The Current Date is :\n\n%A %B %d, %Y"))

برای آشنایی بیشتر با سایر قالب‌بندی‌های تابع strftime، مقاله‌ی Python's strftime directives را مشاهده کنید.

می‌توانید در زیر برنامه‌ی کامل شده و نیز خروجی آن را مشاهده کنید.

import datetime as dt

today_date = dt.date.today()
print(today_date.strftime("The Current Date is :\n\n%A %B %d, %Y"))

خروجی:

Tuesday June 16, 2020

برنامه چهارم

می‌خواهیم برنامه‌ای بنویسیم که از تاریخ که شامل سال و ماه و روز می‌شود، جستجو کند و تاریخ‌هایی که به صورت Palindrome است را برای ما پیدا کرده و چاپ کند. به عنوان مثال: 11.02.2011

این بار نیز کتابخانه‌ی datetime را با روشی دیگر که تمام کلاس‌ها در آن import می‌شوند وارد می‌کنیم. به صورت زیر:

from datetime import *

در ادامه ما از تاریخ 01.01.1900 تا 31.12.2020 را جستجو می‌کنیم. پس به این صورت مقادیر را وارد می‌کنیم:

from datetime import *

start = "01.01.1900"
end = "31.12.2020"

...

همان‌گونه که مشاهده می‌کنید، تاریخی که ما نوشتیم یک رشته محسوب شده و باید به قالب تاریخ در آوریم. برای این منظور از تابع strptime() در کلاس datetime استفاده می‌کنیم. به این صورت:

...

start = "01.01.1900"
end = "31.12.2020"

startd = datetime.strptime(start, "%d.%m.%Y")
endd = datetime.strptime(end, "%d.%m.%Y")

...

اکنون وقت آن است با یک حلقه‌ی تکرار for محدوده‌ی تاریخی مورد نظر را پیمایش کرده و Palindrome تاریخ‌ها را پیدا کنیم. اما قبل از حلقه‌ی تکرار می‌توانیم یک جمله چاپ کنیم که نشان دهد، خروجی ما چیست. محدوده‌ی حلقه‌ی ما از صفر تا مدت روزهای بین دو تاریخ است. به این صورت:

...

startd = datetime.strptime(start, "%d.%m.%Y")
endd = datetime.strptime(end, "%d.%m.%Y")

print("Palindrome dates:")
for i in range((endd-startd).days):

...

در داخل حلقه، با استفاده از تابع timedelta یک روز به تاریخ شروع خود اضافه می‌کنیم. به صورت زیر:

...

print("Palindrome dates:")

for i in range((endd-startd).days):
    startd += timedelta(days = 1)
...

اگر بخواهیم تاریخ را با برعکس خودش مقایسه کنیم، باید به صورتی باشد که هیچ علامت و فاصله‌ای نداشته باشد. برای این منظور از تابع strftime() استفاده می‌کنیم. به این صورت:

...

print("Palindrome dates:")

for i in range((endd-startd).days):
    startd += timedelta(days = 1)
    dstr = datetime.strftime(startd, "%d%m%Y")

...

حال برای به دست آوردن خواسته‌ی برنامه، باید با یک if تاریخ را با برعکس خودش مقایسه کرده و اگر شرط برقرار بود، آن را چاپ کند. به این صورت:

...

dstr = datetime.strftime(startd, "%d%m%Y")
if dstr == dstr[::-1]:
    print(dstr[:2] + "." + dstr[2:4] + "." + dstr[4:])

...

برنامه‌ی مورد نظر ما نوشته شد. کد کامل و یک جای برنامه و همچنین خروجی برنامه را می‌توانید در زیر ببینید:

from datetime import  *

start = "01.01.1900"
end = "31.12.2020"

startd = datetime.strptime(start, "%d.%m.%Y")
endd = datetime.strptime(end, "%d.%m.%Y")

print("Palindrome dates:")
for i in range((endd-startd).days):
    startd += timedelta(days = 1)
    dstr = datetime.strftime(startd, "%d%m%Y")
    if dstr == dstr[::-1]:
        print(dstr[:2] + "." + dstr[2:4] + "." + dstr[4:])

خروجی:

Palindrome dates:

10.02.2001

20.02.2002

01.02.2010

11.02.2011

21.02.2012

02.02.2020

برنامه پنجم

قصد داریم برنامه‌ای بنویسیم که تاریخی را از ورودی دریافت کند و تعداد روزهای زندگی یک فرد تا آن تاریخ، را مشخص و در خروجی چاپ کند. اگر فرد تا آن تاریخ به دنیا نیامده باشد، پیغام مناسبی چاپ کند.

در این برنامه ما یک تاریخ به عنوان سال تولد یک فرد داریم (به عنوان مثال: 24/06/1994) در ادامه باید تاریخی به میلادی از ورودی دریافت کنیم تا اگر او تا این تاریخ به دنیا آمده باشد، تعداد روزهای زندگی او تا آن تاریخ را چاپ کند. در غیر این صورت پیغام "در این تاریخ هنوز متولد نشده‌اید" را چاپ کنیم.

طبق برنامه‌های قبلی، کتابخانه‌ی datetime را import می‌کنیم.

import datetime as dt

در ادامه تاریخ تولد را در متغیری ذخیره می‌کنیم و سپس با دستور input تاریخ مد نظر کاربر را دریافت می‌کنیم. برای آن که قالبی استاندارد برای دریافت تاریخ داشته باشیم، قالب تاریخ ورودی را برای کاربران به صورت مثال می‌آوریم. به صورت زیر:

import datetime as dt

year_born =  dt.date(1982,2,14)
input_year = input('Enter your Date:(e.g. 1990.05.11) ')

...

حال برای آن که تاریخ ورودی را از رشته تبدیل به فرمت تاریخ کنیم همانند برنامه قبل از تابع strptime() استفاده می‌کنیم. توجه داشته باشید به مانند قالبی که رشته تاریخ را دریافت می‌کنید، ترتیب سال و ماه و روز را در تابع strptime مشخص کنید. به این صورت:

...

input_year = input('Enter your Date:(e.g. 1990.05.11) ')
syear = dt.datetime.strptime(input_year, "%Y.%m.%d")

...

اکنون باید تاریخ داده شده را از تاریخ تولد کم کنیم و حاصل را در متغیری ذخیره کنیم. به دلیل اینکه تابع strptime() تاریخ و زمان را خروجی می‌دهد، ما با کمک تابع date فقط تاریخ را فیلتر می‌کنیم. با کمک صفت days خروجی ما، فقط مقدار روزها را نمایش می‌دهد.

...

year_born =  dt.date(1982,2,14)
input_year = input('Enter your Date:(e.g. 1990.05.11) ')
syear = dt.datetime.strptime(input_year, "%Y.%m.%d")

days_life = (syear.date()- year_born).days

...

در انتها ما با یک شرط if-else متغیر days_life را بررسی کرده و اگر مقدار آن کوچکتر مساوی صفر باشد، پیغام "در این تاریخ هنوز متولد نشده‌اید" را به او می‌دهیم و در غیر این صورت مقدار روزهای به دست آمده را چاپ می‌کنیم. به این شکل:

...

days_life = (syear.date()- year_born).days
if days_life <= 0:
    print('You were not born on this date.')
else:
    print('It\'s been {} days from your date of birth to input date'.format(days_life))

این برنامه نیز کامل شد و شما می‌توانید کد یک جا و کامل آن را در زیر مشاهده کنید. خروجی برنامه را نیز در صورتی که تاریخ ورودی صحیح باشد، در ادامه ببینید.

import datetime as dt

year_born =  dt.date(1982,2,14)
input_year = input('Enter your Date:(e.g. 1990.05.11) ')
syear = dt.datetime.strptime(input_year, "%Y.%m.%d")

days_life = (syear.date()- year_born).days

if days_life <= 0:
    print('You were not born on this date.')
else:
    print('It\'s been {} days from your date of birth to input date'.format(days_life))

خروجی:

Enter your Date (e.g. 1990.05.11): 2020.06.16

It's been 14002 days from your date of birth to input date

جمع‌بندی:

سعی کردیم با چند برنامه‌ی کوتاه و مختصر، کار با کتابخانه datetime در پایتون را به شما آموزش دهیم. این تنها بخش کوچکی از توانایی‌های این کتابخانه، به شمار می‌آید و شما می‌توانید برای تمرین و یادگیری بیشتر، با سایر کلاس‌ها و توابع مهم این کتابخانه کار کنید. کتابخانه‌ها در پایتون، جذاب‌ترین و کاربردی‌ترین امکانی است که پایتون و سایر برنامه‌نویسان به صورت عمومی در اختیار همگان قرار داده‌اند تا از کارهای تکراری پرهیز شود. یک برنامه‌نویس حرفه‌ای، بیشترین پیشرفت خود را مدیون آشنایی و شناخت انواع کتابخانه‌ها است. پس شما نیز، برای موفقیت در برنامه‌نویسی، کتابخانه‌های مهم پایتون را بشناسید. امیدواریم مطالب نوشته شده برای شما مفید واقع شود. اگر در این مورد سوال یا نظری داشتید خوشحال می‌شویم که با ما و کاربران سون لرن به اشتراک بگذارید.

اگر به یادگیری بیشتر در زمینه‌ی برنامه نویسی پایتون علاقه داری، یادگیری زبان پایتون بسیار ساده است. و با شرکت در دوره‌ی متخصص پایتون توسعه وب در آینده می‌تونی اپلیکیشن موبایل و دسکتاپ بسازی و وارد حوزه‌ی هوش مصنوعی هم شوی.

چه امتیازی به این مقاله می دید؟
نویسنده عبدالرضا مولایی
هیچوقت برای یادگیری دیر نیست؛ همیشه چیزهای جدید برای آموختن وجود دارد.. این دو جمله، همیشه آویزه‌ی گوش منه، چون باعث میشه از یادگیری چیزهای تازه هراسی نداشته باشم.
ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :

 

نظرات کاربران

علیرضا

برنامه بنویسید که تاریخ تولد شما به شمسی را دریافت کند مشخص کند چند سال، ماه و روز تا زمان حال از آن گذشته است؟

نازنین کریمی مقدم

درود.
جواب هر دو سوالتون استفاده از تقویم جلالی هست که لینک شون در چند کامنت پایین تر گذاشتم.

علیرضا

برنامه ای بنویسید که تاریخ شمسی فعلی را چاپ کند؟

محمدجواد

سلام عالی بود
لطفا آموزش pandas_jalali رو هم بزارید

علی

با عرض سلام:
چطور میشه در کتابخانه pandas در یک dataframe دو ستون که به شمسی است رو مثل تاریخ میلادی کار کرد مثلا زمان بین تاریخ ها رو بدست اورد

نازنین کریمی مقدم

سلام.
برای کار با تقویم جلالی باید از کتابخانه های دیگری استفاده کنید. مانند: pandas_jalali یا jdatetime یا persiantools

پیشنهاد میکنم از persiantools استفاده کنید. توابع کاملتری داره و اگر صفحه ای که لینک کردم رو مطالعه کنید، چگونگی کار با دو تاریخ و محاسبه دوره زمانی رو هم با مثال توضیح داده.

دانا

سلام وقت شما بخیر
ببخشید سوالی داشتم از حضورتون
وقتی از datetime برای محاسبه زمان اموزش مدل یادگیریمون استفاده میکنیم اون زمانی که در خروجی میده بر حسب چه واحدیه؟؟ ثانیه؟ نانو ثانیه؟؟ میکرو ثانیه؟ چیه؟
کدم:
#Training and prediction
t0 = time.time()
adaboost = adaboost.fit(x_train, y_train)
randomforest = randomforest.fit(x_train, y_train)
voting = voting.fit(x_train, y_train)
t1 = time.time()
total = t1-t0
print(‘time:’, total)
خروجی:
time: 2.3944509029388428
ممنون میشم راهنمایی بفرمایید

نازنین کریمی مقدم

درود.
time.time برحسب ثانیه هست و مدت زمان بین هر دوره تناوب یا همون epoch در الگوریتم رو برمیگردونه.

علی بادپروا

سلام آقای مولایی می تئنید کمک کنید
برنامه‌­ای بنوسید که با استفاده از کلاس کتابخانه datetime در پایتون سن یک فرد را بدهد. در صورتی که تاریخ ورودی درست نبود، کلمه‌ی WRONG را در خروجی چاپ کند. فرمت تاریخ به صورت yyyy/mm/dd می‌باشد. (به طور نمونه در صورتی که برای ماه 15 را وارد کند به دلیل آنکه تنها 12 ماه داریم. در خروجی باید WRONG چاپ کند. همین موضوع در مورد تعداد روز نیز صدق می کند و حداکثر 31 می باشد)

توجه: ورودی و خروجی نمونه‌ی زیر مربوط به اجرای برنامه در تاریخ 2019/02/01 است.

ورودی نمونه:

1995/02/03
خروجی نمونه:

24

نازنین کریمی مقدم

سلام.
کار شما دو مرحله داره:
1. کارکردن با استرینگ ورودی و شکستن آن به سال – ماه – روز
2. محاسبه سن براساس این اطلاعات

اول این لینک رو ببینید توش به طور کامل استفاده از این کتابخونه برای محاسبه سن رو توضیح داده. باز اگه جایی رو متوجه نشدید بگید توضیح بدم.
حالا کاری که باید بکنید اینه که ورودی تاریخ رو با split بشکونید تا مقدار سال و ماه و روز رو به صورت جدا بدست بیارید. رو اینا شرط بذارید که مثلا اگر ماه 7 تا 12 بود، روز میتونه حداکثر 30 باشه و اگر این قانون رو نقض کرد، چاپ کنه: WRONG
بعد اگه همه مقادیر مجاز بودند، مثلا در راه حل دوم، تو تابع محاسبه سن ازشون استفاده کنید.

امیرمهدی

خیلی ممنون واقعا لذت بردم
بسیار کامل و مفید

عبدالرضا مولایی

ممنون شما لطف دارین.. خوشحالیم که مقاله براتون مفید واقع شده