การหา Day of Year
สำหรับในบทความนี้จะแสดงวิธีการหา day of year คือ ต้องการหาว่า วันที่ (วันเดือนปี) เป็นลำดับวันที่เท่าไร ของปี เช่น 2022–01–01 = 1 , 2022–12–31 = 365 เป็นต้น
สิ่งที่เราต้องคำนึงถึงด้วยคือ ปีที่เราต้องการหานั้นเป็น leap year (ปีอธิกสุรทิน คือ เดือน กุมภาพันธ์ มี 29 วัน) ด้วยหรือไม่
def is_leap_year(year):
if year % 100 == 0:
return year % 400 == 0
return year % 4 == 0print(is_leap_year(2022)) # False
print(is_leap_year(2023)) # False
print(is_leap_year(2024)) # True
print(is_leap_year(2025)) # False# ใช้ module calendar
import calendar
print(calendar.isleap(2022)) # False
print(calendar.isleap(2023)) # False
print(calendar.isleap(2024)) # True
print(calendar.isleap(2025)) # False
code ด้านบนนี้ทำการสร้าง function เพื่อหาว่าปีที่ต้องการนั้นเป็น leap year หรือไม่(กฏว่าปีไหนเป็น leap year ขอละไว้)
สามารถเขียนโปรแแกรมหาค่า day of year ได้ดังนี้
จาก code ด้านบน มีอัลกอริทึม ดังนี้
- วันที่ กำหนด format เป็น yyyy-mm-dd
- ทำการ split ข้อความโดยใช้ “-” เป็นตัวแยก และ นำค่าไปเก็บในตัวแปร y, m, d
- ทำการสร้าง list จำนวนวันในเดือนนั้น ๆ โดยให้สมาชิกตัวแรกเป็น 0 (สามารถ ละ 31 ตัวสุดท้ายได้ แต่ขอใส่ไว้เพื่อให้สื่อว่ามันคือจำนวนวันในแต่ละเดือน)
- จากนั้นทำการ ตรวจสอบว่าปีที่รับมานั้นเป็น leap year หรือไม่ หากเป็น ก็ให้แก้จำนวนวันของเดือน กุมภาพันธ์ จาก 28 เป็น 29
- ทำการวน loop บวกเพิ่ม วันที่(ตัวแปร d) กับจำนวนวันของเดือนก่อนจะถึงเดือนที่ต้องการ
ก็จะได้ ลำดับของวันที่ในปีนั้น
จะเห็นว่า จากอัลกอริทึมนี้เราต้องทำอะไรเองหลายอย่าง ถือว่าเป็นการผึกกระบวนการคิดได้ดีที่เดียว แต่หากเราเปลี่ยนวิธีแก้ปัญหาเป็น
day of year = (วันที่ต้องการ — วันที่ 1 มกราคม ของปีเดียวกัน) + 1
ก็ได้เหมือนผลเหมือนกัน สามารถเขียน code ได้ดังนี้
import datetimeday = datetime.date(2022,12,31)
d = (day — datetime.date(day.year,1,1)).days + 1print(d) # 365
จะเห็นว่าโปรแกรมนั้นสั้นลงมาก โดยเราจะต้องใช้ module datetime ช่วยในการสร้าง object date ของวันที่ ที่ต้องการ และ วันที่ 1 มกราคม ของปีเดียวกัน
ทั้งนี้ที่ module datetime ยังมี built in funcition ที่สามารถหาค่าต่าง ๆ ของ object date (datetime ก็ได้ด้วย) โดยค่า day of year หาได้ดังนี้
import datetimeday = datetime.date(2022,12,31)
day = day.timetuple()
d = day.tm_ydayprint(d) # 365
จาก code ด้านบนจะทำการใช้ function timetuple() ซึ่งจะ return ค่าต่าง ๆ ที่เกี่ยวข้องกับ object นั้นออกมา โดยจะมี tm_yday เป็นลำดับวันในปีนั้น ๆ ด้วย
นอกจากนี้ module datetime ยังมีฟังก์ชันที่สามาถแสดง day of year ได้อีก ดังนี้
import datetimeday = datetime.date(2022,12,31)
d = day.strftime(‘%j’) # d is string
d = int(d)print(d) # 365
โดยจะใช้ฟังก์ชัน strftime() ซึ่งเอาไว้แปลง object datetime ให้เป็น string โดยการกำหนด parameter เป็น %j จะเป็นการแสดงค่า day of year หากต้องการนำไปคำนวณต่อก็ให้ทำการแปลงเป็น int ก่อนด้วย
ที่กล่าวมานั้นก็จะเป็นวิธีการหาค่า day of year ที่นี้ หากโจทย์ของเราเปลี่ยนใหม่เป็นการหาย้อนกลับ คือ ให้ day of year และปีมา ต้องการหาว่าตรงกับวันไหนของปีนั้น เราจะแก้ปัญหานี้ ด้วยอัลกอริทึมนี้
วันที่ = วันที่ 1 มกราคม ของปีเดียวกัน + (day of year - 1)
โดยจะใช้ function timedelta() ช่วยในการ ลบ วันที่
import datetimed = 365
year = 2022first_date = datetime.date(year,1,1)date = first_date + datetime.timedelta(days=d-1)print(date) # 2022–12–31
ทั้งนี้ขอแสดงอัลกอริทึมนี้เพียงวิธีเดียว