การหา Day of Year

Kritchai Tadbhusinwat
2 min readMar 13, 2022

--

image from https://www.thoughtco.com/

สำหรับในบทความนี้จะแสดงวิธีการหา 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 == 0
print(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 + 1
print(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_yday
print(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 = 2022
first_date = datetime.date(year,1,1)date = first_date + datetime.timedelta(days=d-1)print(date) # 2022–12–31

ทั้งนี้ขอแสดงอัลกอริทึมนี้เพียงวิธีเดียว

--

--

Kritchai Tadbhusinwat
Kritchai Tadbhusinwat

Written by Kritchai Tadbhusinwat

Programmer บริษัทเอกชนที่เป็นส่วนหนึ่งของเบื้องหลังให้กับบริษัทชั้นนำต่าง ๆ และ Tutor สอนกวดวิชาคณิตศาสตร์/ฟิสิกส์ เพื่อเตรียมสอบเข้ามหาวิทยาลัย

No responses yet