بکندباز

معرفی چند ماژول پایتون برای کار با تاریخ و زمان

کار با داده های تاریخ و زمان یک مهارت مهم در پایتون است. این مقاله مهم ترین ماژول های تاریخ و زمان پایتون را بررسی می کند.

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

چند ماژول مفید پایتون وجود دارد که عملکردی را برای سهولت در برخورد با تاریخ و زمان ارائه می دهند. در این مقاله چند مورد از مفیدترین ابزارها برای رسیدگی به تاریخ و زمان را (با مثال) معرفی خواهیم کرد.

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

ماژول time

اولین ماژول time نام دارد و همراه با نصب پایتون ارائه می شود. بیایید با گرفتن زمان فعلی شروع کنیم:

import time
time_now = time.time()
print(time_now)
#1653035191.6578639

خروجی ای که دریافت می کنید بسته به زمان اجرای این دستور تغییر می کند. این دستور عدد بسیار بزرگی را برمی گرداند. این زمان (بر حسب ثانیه) است که از زمان مرجع «epoch» محاسبه شده است. برای اکثر سیستم‌ها، epoch برابر با پنج‌شنبه 1 ژانویه 1970 ساعت 00:00:00 UTC است. تاریخ ها و زمان های قبل از این زمان به صورت عددی منفی بیان می شوند. نمایش زمان بر حسب ثانیه از سال 1970 چندان مفید نیست، بنابراین می توان آن را به عنوان یک رشته از پیش قالب بندی شده نمایش داد:

print(time.ctime(time_now))
#Fri May 20 10:26:31 2022

در اینجا، ما از متد ctime() برای تبدیل ثانیه های سپری شده به فرمتی آشناتر استفاده کرده ایم.

از تابع time() می توان برای بررسی زمان اجرای یک بلوک کد استفاده کرد، که می تواند اطلاعات بسیار ارزشمندی در هنگام نوشتن برنامه های پیچیده تر به ما بدهد. یکی دیگر از عملکردهای جالب این ماژول متد sleep() است که می تواند اجرای یک برنامه را برای چند ثانیه معین متوقف کند. مثال زیر هر دوی این توابع را در عمل نشان می دهد:

import time
t1 = time.time()
for i in range(4):
     print(i)
     time.sleep(1)
t2 = time.time()
print('Runtime: %s seconds'%(t2 - t1))
#0
#1
#2
#3
#Runtime: 4.030589818954468 seconds

در اینجا ما زمان کل حلقه for را محاسبه می کنیم. در حلقه، فقط ایندکس ها را چاپ می کنیم و سپس به مدت 1 ثانیه برنامه را متوقف می کنیم. برای اطلاعات بیشتر در مورد پارامتر های print مقاله تابع print() در پایتون را بررسی کنید . زمان اجرای نهایی به سیستم بستگی دارد اما باید کمی بیشتر از 4 ثانیه باشد. عملکرد این ماژول بسیار بیشتر از آنچه در اینجا می توانیم نشان دهیم است، بنابراین برای جزئیات بیشتر به مستندات مراجعه کنید.

ماژول calendar

ماژول calendar عملکردهای مربوط به خروجی تقویم را ارائه می دهد. همچنین همراه با نصب استاندارد پایتون ارائه می شود.

# Python program to display calendar of
# given month of the year

# import module
import calendar

yy = 2020

# display the calendar
print(calendar.calendar(yy))

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

# Python program to display calendar of
# given month of the year

# import module
import calendar

yy = 2017
mm = 11

# display the calendar
print(calendar.month(yy, mm))

اگر این توابع را آزمایش کنید، متوجه می‌شوید که تقویم‌ها از دوشنبه به عنوان اولین روز هفته استفاده می‌کنند که دارای ایندکس 0 است. می‌توانید با استفاده از تابع weekday()، شماره روز هفته را از 0 تا 6 برای هر تاریخی دریافت کنید. این استاندارد شروع هفته از دوشنبه، با ایندکس 0، در سایر ماژول های پایتون نیز استفاده می شود.

کلاس Calendar شامل چند iterable است که می توانید از آنها برای تکرار در روزهای هفته و ماه های سال استفاده کنید. همچنین یک کلاس TextCalendarو یک کلاس HTMLCalendar وجود دارد که می تواند متن ساده و تقویم های HTML تولید کند.

ماژول datetime

با کمک ماژول datetime می توانید تاریخ و زمان را به عنوان یک شیء تعریف کنید. همانطور که در مستندات آن ذکر شده است، تمرکز این ماژول بر استخراج ویژگی های کارآمد برای نمایش و دستکاری اشیاء datetime است. اما به این محدود نمی شود. همچنین می توانید از آن برای محاسبه تعداد روزهای بین دو تاریخ استفاده کنید. برای تعریف شیء datetime، ماژول را وارد کرده و کارهای زیر را انجام دهید:

import datetime
date1 = datetime.datetime(2022, 1, 1, 12, 30, 0)
print(date1)

متد datetime، تاریخ را با استفاده از سال، ماه و … تا میکروثانیه با آرگومان های الزامی year و month و day تعریف می کند. شما همچنین می توانید به صورت اختیاری اطلاعات منطقه زمانی را هنگام تعریف شیء datetime اضافه کنید. اگر سعی کنید یک تاریخ نامعتبر تعریف کنید، برای مثال با آرگومان day = 35، خطای ValueError: day is out of range for month را دریافت خواهید کرد.

می توانید سال را با date1.year، که یک عدد صحیح برمی گرداند بازیابی کنید. این روش، همچنین برای سایر اطلاعات تاریخ و زمان تا میکروثانیه کار می کند. همانطور که قبلاً بحث کردیم، روز هفته (به عنوان یک عدد صحیح بین 0 و 6) را می توان با استفاده از تابع weekday() بازیابی کرد:

import datetime
date1 = datetime.datetime(2022, 1, 1, 12, 30, 0)
print(date1.weekday()) #5

عدد 5 مربوط به شنبه است. می‌توانید با چاپ تقویم با استفاده از ماژول calendar، این موضوع را دوباره بررسی کنید.

بیایید یک شیء datetime دیگر ایجاد کنیم:

date2 = datetime.datetime(2021, 7, 31)

تفاوت بین این دو تاریخ را می توان به راحتی محاسبه و چاپ کرد:

time_diff = date1 - date2
print('Number of days between %s and %s = %s'%(date1, date2, time_diff.days))
 
#Number of days between 2022-01-01 12:30:00 and 2021-07-31 00:00:00 = 154

این یک شیء timedelta جدید ایجاد می کند که نشان دهنده مدت زمان است. ما در این مثال، از متد days() برای بدست آوردن اختلاف زمانی بر حسب روز استفاده کرده ایم، سپس پاسخ را چاپ کرده ایم. حتی اگر اختلاف زمانی چندین سال باشد، بزرگترین واحد نمایش در شیء timedelta بر حسب روز خواهد بود.

در مثال بالا، ما به سادگی شیء را با استفاده از تابع print() نمایش دادیم. در این روش، فرمت پیش فرض زمانی YYYY-MM-DD HH:MM:SS است. ماژول datetime دارای برخی عملکردهای مفید برای کمک به فرمت دهی و نمایش تاریخ است. به عنوان مثال، متد strftime() یک متد نمونه است که به شما امکان می دهد یک نمایش رشته ای از شیء datetime ایجاد کنید. در اینجا چند نمونه از نحوه استفاده از رشته ها در فرمت های مختلف برای چاپ اطلاعات تاریخ و زمان با استفاده از این روش آورده شده است:

print(date1.strftime('%Y %m %d'))
#2022 01 01
 
print(date1.strftime('%Y-%m-%d'))
#2022-01-01
 
print(date1.strftime('%A %d %B %Y'))
#Saturday 01 January 2022
 
print(date1.strftime('%a %d %b %y, %H:%M:%S %p'))
#Sat 01 Jan 22, 12:30:00 PM

گزینه های بیشتری برای قالب بندی رشته خروجی تاریخ/زمان وجود دارد. برای الهام گرفتن به کدهای فرمت نگاهی بیندازید .

متدی به نام strptime() مربوط به این کلاس داریم. برعکس مثال قبلی، یک رشته  را به یک شیء datetime تبدیل می کند. این روش دارای دو آرگومان الزامی است: یک رشته تاریخ و یک رشته فرمت. از همان کدهای فرمتی که در بالا ذکر شد می توان استفاده کرد.

مثال:

import datetime
date3 = datetime.datetime.strptime('2022-01-01', '%Y-%m-%d')
print(date3)
#2022-01-01 00:00:00

کار در مناطق زمانی مختلف

آخرین ویژگی که در این آموزش نشان خواهیم داد نحوه مدیریت مناطق زمانی است. هنگامی که یک شیء datetime را ایجاد می کنید، می توانید منطقه زمانی را با کمک کتابخانه PYTZ تعریف کنید. برای دریافت یک لیست کامل از مناطق زمانی، به سادگی pytz.common_timezones را در ترمینال اجرا کنید، که لیستی از رشته ها را چاپ می کند. در مثال زیر چند منطقه زمانی را انتخاب کنیم و زمان فعلی را بر اساس آنها بررسی می کنیم:

import pytz
time_zones = ['America/New_York', 'Asia/Seoul', 'Australia/Melbourne', 'Europe/Zagreb']
for time_zone in time_zones:
     print(datetime.datetime.now(tz=pytz.timezone(time_zone)))
#2022-05-20 04:26:34.134504-04:00
#2022-05-20 17:26:34.134504+09:00
#2022-05-20 18:26:34.134504+10:00
#2022-05-20 10:26:34.134504+02:00

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

backendbaz

مدیر وب سایت بکندباز

دیدگاه‌ها

*
*