สรุปการเขียน Code จัดการวันที่และเวลาครบจบใน Python working-with-dates-and-times-in-python

Image placeholder
แวะมาทักทายกันได้


Table of Content


1️⃣0️⃣0️⃣  เพื่อสนันสนุนผู้เขียน เป็นกำลังใจและค่า web server ให้แก่ผู้เขียน อยากให้ผู้อ่านทุกท่าน ช่วยกด google ads ทั้งด้านข้างและระหว่างบทสัก 2-3 click ให้ด้วยนะครับ กดฟรีไม่เสียเงิน —> เหตุผลที่ต้อง click google ads ให้ผู้เขียน




สรุปการเขียน Code จัดการวันที่และเวลาครบจบใน Python ตอนที่ 1


1️⃣ ข้อมูลประเภทวันที่และเวลา (Datetime) เป็นข้อมูลที่สามารถกำหนดให้เกิดขึ้น เปลี่ยนแปลง หรือ การลบออกไป ของ สิ่งต่างๆที่ต้องการกำหนด พูดง่ายๆก็คือ มีข้อมูลประเภทวันที่และเวลามีอยู่รอบตัวเรา

2️⃣ ซึ่งเป็นข้อมูลที่พบได้บ่อย และ เป็นงานที่สำคัญในการจัดการข้อมูล ลองมาดูตัวอย่างของการใช้ Datetime ในงานต่างๆ กัน

3️⃣ ตัวอย่างงานที่ใช้วิเคราะห์ด้วย วันที่และเวลา

  • การวิเคราะห์ Time series เป็นการรวบรวมข้อมูลประเภทเวลาตลอดเวลา เช่น ราคาหุ้น, สภาพอากาศ,หรือกิจกรรมของผู้ใช้งานแอปพลิเคชัน
  • การติดตามสถานการณ์ เช่น การคลิกเว็บไซต์ ระยะเวลาที่ระบบ active เป็นต้น
  • การวิเคราะห์พฤติกรรมของลูกค้า ด้วยพฤติกรรมของลูกค้ามีการเปลี่ยนแปลงอยู่ตลอดเวลา เช่น วิเคราะห์ความถี่ของการซื้อสินค้า ความชื่นชอบ ผลกระทบต่างๆในโลก
  • การทำนาย เราสามารถนำข้อมูลเรื่องเวลาที่มากพอ มาทำนาย การซื้อสินค้าตามประเภท เช่น มีข้อมูลครบ 1 ปี มาตรวจสอบดูว่ามีสินค้าประเภทอะไรใน ฤดูกาลไหน ช่วงเดือนอะไร เกิดการซื้อตามช่วงเทศกาลหรือไม่ เพื่อที่จะได้เตรียมตัว เตรียมสินค้ามาจำหน่ายได้

4️⃣ มีสิ่งต่างๆที่จำเป็นจะต้องเรียนรู้ในการจัดการ วันที่และเวลา ดังนี้

  • การสร้างข้อมูลเวลา (create date)
  • การเรียกข้อมูลเวลาปัจจุบัน (current date)
  • การนับจำนวน คำนวนวันที่และเวลา ดูความแตกต่าง (different)
  • ขอบเขตพื้นที่เวลา (timezone)
  • ปฏิทิน (calendar)
  • การแปลง format ตามมาตรฐานของเวลาต่างๆ
  • การแปลง string format มาเป็น ข้อมูล datetime

5️⃣ ใน Python มี Library ต่างๆที่ใช้ในการจัดการ ข้อมูลวันที่และเวลา ไม่ว่าจะเป็น

  • String ข้อมูล
  • Number ตัวเลข
  • Numpy Array
  • Date
  • ——————— *

  • 1️⃣0️⃣0️⃣ หากใครไม่อยากพลาด *

  • โพสต์เรื่องเกี่ยวกับ *

  • data analyst, data science, *

  • data engineer และ programming *

  • ในโพสต์ถัดๆไป ฝากแชร์ *

  • กดติดตาม profile กันไว้ด้วยนะครับ *

  • https://www.sklsongkiat.com *

  • *——————— **

6️⃣ ทำไมเราต้องมาเรียนรู้ว่า library ของ Datetime ทำงานอย่างไร

ถ้าเราลองจินตนาการว่า นาฬิกาในมือถือ คือ โปรแกรม Datetime เราก็แค่เปิดหน้าจอแล้ว ดูการแสดงผลที่หน้าจอ เท่านี้ก็เรียบร้อยตามความต้องการ คือ รู้เวลาว่ากี่โมงแล้ว ซึ่งเป็นพฤติกรรมทั่วไปของ ผู้ใช้งาน

7️⃣ นาฬิกาในมือถือ เปรียบเสมือน Blackbox หรือกล่องดำที่ ผู้ใช้งานไม่จำเป็นต้องเข้าใจกระบวนการการทำงานของระบบ แต่ถ้าอยู่ในฐานะ Programmer หรือนักพัฒนาซอฟต์แวร์ จำเป็นต้องเข้าใจขั้นตอนการทำงานของ Library ต่างๆ เพื่อเข้าใจ ข้อจำกัดที่ Library สามารถทำได้ Library หนึ่งไม่สามารถแก้ปัญหาได้ทุกอย่างในกระบวนการพัฒนาซอฟต์แวร์ ต้องเรียนรู้ว่ามันสามารถทำอะไรได้บ้าง

8️⃣ ถ้าให้ยกตัวอย่าง ปัญหาเช่น เกิดภัยภิบัติ พายุ hurricane ที่รัฐฟรอริดาของสหรัฐอเมริกาตลอดระยะเวลา 67 ปี มีชุดข้อมูลเกิดพายุ ครั้งสุดท้ายของปี 2016 เมื่อ วันที่ 7 ตุลาคม 2016 และ ครั้งสุดท้ายของปี 2017 เมื่อวันที่ 21 มิถุนายน 2017

9️⃣ สิ่งที่จะตอบคำถามว่าเราต้องเรียน library ของ Datetime ไปทำไม ลองอ่านคำถามเหล่านี้ดูครับ

  • จะรู้ได้อย่างไรว่า พายุมันเกิดขึ้นไปจำนวนกี่วัน
  • จะรู้ได้อย่างไรว่า เกิดขึ้นกี่ครั้ง เกิดขึ้นเมื่อไร
  • จะรู้ได้อย่างไรว่า เกิดขึ้นวันในของสัปดาห์

1️⃣0️⃣ Datetime ได้เตรียม function เพื่อช่วยแก้ปัญหาเหล่านี้ไว้ให้แล้ว

1️⃣1️⃣ การสร้างข้อมูลเวลา (create date)

เริ่มจากการ import library และ สร้างข้อมูลวันที่ขึ้นมา ข้อมูลที่ได้มันจะอยู่ในลักษณะที่เรียกว่า Object ที่มี attribute เป็น day month year สามารถเรียกข้อมูลตาม code ด้านล่าง

import datetime

date1 = datetime.date(2016, 10, 7)

print(date1.year)
print(date1.month)
print(date1.day)

## Result ## 
2016
10
7

1️⃣2️⃣ หรือ ถ้าหากเราอยากรู้ว่า weekday คือวันอะไร ให้ใช้ method weekday มันจะได้เลข 4 ซึ่งแทนค่าตัวเลขคือ วันจันทร์ ถึง อาทิตย์ โดยเลข 0 คือ วันจันทร์ จนถึงเลข 6 คือวันอาทิตย์

print(date1.weekday())

## Result ## 
4

1️⃣3️⃣ ตัวอย่างการใช้งานกับชุดข้อมูล

# Counter for how many before June 1
early_hurricanes = 0

# We loop over the dates
for hurricane in florida_hurricane_dates:
  # Check if the month is before June (month number 6)
  if hurricane.month < 6:
    early_hurricanes = early_hurricanes + 1
    
print(early_hurricanes)

## Result ##

10

1️⃣4️⃣ การเรียกข้อมูลเวลาปัจจุบัน (current date)

ในการสร้างออบเจ็ควันที่และเวลา จะใช้ module ที่ชื่อ ****datetime ใช้ในการจัดการวันที่และเวลา module นี้ประกอบด้วย function class ต่างๆ ที่ใช้สำหรับเป็นแม่พิมพ์หรือตัวแทนข้อมูล และ จัดการวันที่และเวลา ซึ่งเป็นคลาสที่สำคัญ ได้แก่

  • datetime - เป็น class ที่เป็นเหมือนแม่พิมพ์หรือตัวแทนข้อมูล ให้กับ date และ time ในรูปแบบที่นำไปแปลงต่อได้ทุกแบบ
  • date - เป็น class สำหรับเป็นแม่พิมพ์หรือตัวแทนข้อมูล เฉพาะวันที่
  • time - เป็น class สำหรับเป็นแม่พิมพ์หรือตัวแทนข้อมูล เฉพาะเวลา
  • timedelta - เป็น class สำหรับเป็นแม่พิมพ์หรือตัวแทนข้อมูล ที่เป็นช่วงเวลา

1️⃣5️⃣ ถ้าหากเราอยากจะเรียกวันที่ปัจจุบัน ก็ใช้ method now() จาก แม่พิมพ์ datetime เช่น

from datetime import datetime

now = datetime.now()
print(now)

## Result ##
2023-11-15 09:41:56.863188

1️⃣6️⃣ นอกจากนี้ แปลงข้อมูลแยกออกจากกัน

from datetime import datetime

now = datetime.now()

print(now.year)
print(now.month)
print(now.day)
print(now.hour)
print(now.minute)
print(now.second)

## Result ##
2023
11
15
9
41
56

1️⃣7️⃣ หรืออยากจะการเปรียบเทียบวันที่และเวลา สามารถเปรียบเทียบวันที่และเวลาเพื่อดูว่าวันที่และเวลาใดมาก่อนหรือมาหลังโดยใช้ตัวดำเนินการเปรียบเทียบ เช่น

from datetime import datetime

now = datetime.now()

print(now == datetime.now())
print(now < datetime.now() + timedelta(days=1))
print(now > datetime.now() - timedelta(days=1))

## Result ##
True
False
True

1️⃣8️⃣  จากที่เราได้เข้าการสร้างแม่พิมพ์วันที่และเวลา และการใช้ method เรียกข้อมูล แปลงข้อมูลวันที่ไปแล้ว คราวนี้จะพูดถึงวิธีการคำนวน เช่น

  • การนับวันระหว่าง วันเวลา 2 เหตุการณ์
  • การเรียงลำดับเวลา

1️⃣9️⃣ เราสามารถที่จะใช้ date object ในการสร้าง object date ขึ้นมา แล้วนำมาลบกันได้ทันที ยกตัวอย่างเช่น

import datetime

# Create two date objects.
date1 = datetime.date(2023, 11, 5)
date2 = datetime.date(2023, 12, 4)

# Calculate the number of days between the two dates.
date_diff = date2 - date1
print(date_diff.days)

## Result ##
30

2️⃣0️⃣ หรือหากไม่ต้องการจำนวนของวันที่แตกต่าง ก็ใช้ method timedelta แล้วใส่ตัวเลขเข้าไปเพื่อรู้ วันที่ก็ได้ ยกตัวอย่างเช่น

# Create a timedelta object representing 29 days.
td = datetime.timedelta(days=29)

## Result ##
2023-12-04

2️⃣1️⃣ ทำไมเวลาถึง บวก ลบ กันได้อย่างอิสระ เพราะว่า จริงๆแล้ว datetime ถูกสร้างเอาไว้ในรูปแบบ millsecond ที่ datetime ในภาษา Python เริ่มตั้งแต่ วันที่ 1 มกราคม 1900 ถ้าแปลงเป็น millsecond มันก็ คือ - 2208988800.0 millisecond

2️⃣2️⃣ จะเห็นได้ว่าค่า millisecond ของวันที่เริ่มต้น คือ -2208988800.0 นั่นเอง

คำอธิบายเพิ่มเติม:

  • โมดูล datetime ในภาษา Python เริ่มต้นการนับ millisecond ตั้งแต่ปี 1900 เป็นต้นไป โดย millisecond เริ่มต้นมีค่าเท่ากับ 0
  • วันที่เริ่มต้นของโมดูล datetime คือวันที่ 1 มกราคม 1900 ดังนั้น millisecond ของวันที่เริ่มต้นจึงมีค่าเท่ากับ 2208988800.0
  • ตัวเลข 2208988800.0 นั้นเกิดจากการนำจำนวนวันนับตั้งแต่วันที่ 1 มกราคม 1900 จนถึงปัจจุบันมาคูณด้วย 86400000 ซึ่งก็คือจำนวน millisecond ใน 1 วัน

2️⃣3️⃣ การแปลงวันที่เป็นสตริงใน Python

ในวิดีโอนี้ เราเรียนรู้เกี่ยวกับวิธีแปลงวันที่เป็นสตริงใน Python มีสองวิธีหลักในการดำเนินการนี้:

  • รูปแบบ ISO 8601: รูปแบบมาตรฐานที่อ่านง่ายในการรับวันที่ในรูปแบบ ISO 8601 สามารถใช้ methd isoformat ได้
  • methd strftime(): methd นี้ช่วยให้คุณจัดรูปแบบวันที่ ที่มีหลาย format เช่น String format หน้าตาแบบนี้ "%Y-%m-%d %H:%M:%S" เป็นตัวกำหนด format ที่ส่งค่ากลับมาให้

2️⃣4️⃣ รูปแบบ ISO 8601 ยกตัวอย่างเช่น

import datetime
date = datetime.date(2023, 11, 5)

# ISO 8601
iso_date = date.isoformat()

print(iso_date)

## Result ##
2023-11-05

2️⃣5️⃣ รูปแบบ String format ยกตัวอย่างเช่น

import datetime
date = datetime.date(2023, 11, 5)

custom_date = date.strftime("%Y-%m-%d %H:%M:%S")
print(custom_date)

## Result ##
2023-11-05 19:27:21

2️⃣6️⃣ ทั้งยังมี standard ต่างๆมากมายที่จะต้องเรียนรู้เพิ่มเติม เช่น

first_date = sorted(florida_hurricane_dates)[0]

## Result ##

datetime.date(1950, 8, 31)

# Convert to ISO and US formats
iso = "Our earliest hurricane date: " + first_date.isoformat()
us = "Our earliest hurricane date: " + first_date.strftime("%d")

print("ISO: " + iso)
print("US: " + us)

## Result ##

ISO: Our earliest hurricane date: 1950-08-31
US: Our earliest hurricane date: 31


1️⃣0️⃣0️⃣ โดยสรุป ข้อมูลประเภทวันที่และเวลา (Datetime) เป็นข้อมูลประเภทวันที่และเวลามีอยู่รอบตัวเรา ถ้าอยากใช้ประโยชน์การวิเคราะห์ข้อมูลเชิงลึก จำเป็นต้องรู้เครื่องมือที่สามารถสร้างภาพต่างๆ ด้วยวันที่และเวลาได้


1️⃣0️⃣0️⃣ ขอขอบคุณผู้อ่านทุกท่านที่ติดตาม โปรดติดตามตอนต่อไป และสนันสนุนผู้เขียน เพื่อเป็นกำลังใจและค่า web server แก่ผู้เขียน ด้วยการกด google ads ทั้งด้านข้างและระหว่างบทสัก 2-3 click ให้ด้วยนะครับ กดฟรีไม่เสียเงิน —> เหตุผลที่ต้อง click google ads ให้ผู้เขียน






สรุปการเขียน Code จัดการวันที่และเวลาครบจบใน Python ตอนที่ 2



1️⃣ จากตอนที่ 1 ได้เกริ่นนำเกี่ยวกับการใช้ datetime ที่เอาไว้ใช้จัดการข้อมูล วันที่และเวลาในภาษา python โดยประกอบไปด้วยส่วนต่างๆ เช่น การ parse string การใช้ format string ของการใช้ datetime object และยกตัวอย่างสถานการณ์ในการนำ datetime ไปใช้งานในชีวิตจริง สามารถอ่านย้อนหลัง ตอนที่ 1

Table of Content




2️⃣ สำหรับตอนที่ 2 นี้ เขียนสรุปถึง การใช้ method ต่างๆ ที่จำเป็นในการจัดการ datetime เพิ่มเติม สามารถจัดการได้หลายรูปแบบ

  • การสร้าง datetime Object
  • การแก้ไขข้อมูล datetime
  • การแปลงข้อมูล วันที่และเวลา ตามรูปแบบที่กำหนด
  • การใช้ method ในการคำนวนระยะเวลา duration

3️⃣ การสร้าง Datetime Object

การสร้าง datetime เราสามารถที่จะใช้ datetime ตัวสร้าง Object หรือ แม่พิมพ์ ซึ่งต่อไปจะเรียกสิ่งนี้ว่า Object ตลอดบทความ อย่างที่ได้เขียนเอาไว้ในตอนที่ 1 เป็นเสมือนแม่พิมพ์ข้อมูล วันที่และเวลา นอกจากที่สามารถรับค่า ปี-เดือน-วัน เขียนเอาไว้ในตอนที่ 1 ยังสามารถรับข้อมูลที่เป็นเวลา (ชั่วโมง:นาที:วินาที) และเวลาที่เป็น Micro second (us) ได้อีกด้วย ตัวอย่างเช่น

import datetime

dt = datetime(2017, 10, 1, 15, 23, 25, 500000)

** 500000 ไมโครวินาที (us) จะเท่ากับ 0.5 วินาที

4️⃣ การเข้าถึงคุณสมบัติของ datetime object

ถ้าเปรียบเทียบ Object เป็นตารางก็น่าจะมองเห็นภาพได้ง่ายขึ้น ลองดูตารางด้านล่าง ซึ่งเป็นตัวแทนของ แม่พิมพ์ datetime ที่สร้างเอาไว้เมื่อสักครู่นี้



5️⃣ จากตารางเปรียบเหมือนเป็น Object ที่เอาไว้ปรับเปลี่ยนแก้ไขข้อมูลลงไปในตารางได้ตลอดเวลา ซึ่ง ในการเข้าถึงข้อมูลแต่ละช่องนั้นจะต้องใช้ property หรือ คุณสมบัติของ Object สามารถที่จะเรียกข้อมูลด้วยชื่อออกมาได้เลย ยกตัวอย่างเช่น

date1 = datetime(2017, 10, 1, 15, 23, 25, 500000)

print(date1.year)
print(date1.month)
print(date1.day)
print(date1.hour)
print(date1.minute)
print(date1.second)
print(date1.microsecond)

## Result ## 
2017
10
1
23
25
500000
* ———— *
* 1️⃣0️⃣0️⃣ หากใครไม่อยากพลาด *
* โพสต์เรื่องเกี่ยวกับ *
data analyst, data science, *
data engineer และ programming *
ในโพสต์ถัดๆไป ฝากแชร์ *
กดติดตาม profile กันไว้ด้วยนะครับ *
https://www.sklsongkiat.com *
* ——————— *


6️⃣ นอกจากรูปแบบการใส่ข้อมูลลงใน argument หรือช่องรับข้อมูลลงไปใน datetime object สามารถที่จะเขียนให้เห็นอย่างชัดเจน สามารถระบุชื่อ property ลงไปที่ argument ได้เลย อย่างเช่น

date2 = datetime(year=2017, 
									month=10, 
									day=1, 
									hour=15, 
									minute=23, 
									second=25, 
									microsecond=500000)

7️⃣ เรามาลองดูผลลัพท์ที่ได้จากการสร้างข้อมูล วันที่และเวลา แบบนี้กัน

print(date1)
print(date2)

## Result ## 

2017-10-01 15:23:25.500000
2017-10-01 15:23:25.500000

8️⃣ การแก้ไขข้อมูล datetime

เราสามารถที่จะแก้ไขข้อมูลด้วยการใช้ method replace ได้ ยกตัวอย่างเช่น

date_replace_hour = date1.replace(minute=0, secode=0, microsecond=0)
print(date_replace_hour)

## Result ##

2017-10-01 15:00:00

9️⃣ ลองมาประยุกต์ใช้กันดูสักเล็กน้อย สมมติว่าเราเก็บข้อมูล การเริ่มต้น และ สิ้นสุดของช่วงเวลาหนึ่งที่เก็บข้อมูลเอาไว้ใน List ดังนี้

one_datetimes

[{'start': datetime.datetime(2017, 10, 1, 15, 23, 25),
  'end': datetime.datetime(2017, 10, 1, 15, 26, 26)},
 {'start': datetime.datetime(2017, 10, 1, 15, 42, 57),
  'end': datetime.datetime(2017, 10, 1, 17, 49, 59)},
 {'start': datetime.datetime(2017, 10, 2, 6, 37, 10),
  'end': datetime.datetime(2017, 10, 2, 6, 42, 53)},
 {'start': datetime.datetime(2017, 10, 2, 8, 56, 45),
  'end': datetime.datetime(2017, 10, 2, 9, 18, 3)},
 {'start': datetime.datetime(2017, 10, 2, 18, 23, 48),
  'end': datetime.datetime(2017, 10, 2, 18, 45, 5)},
 {'start': datetime.datetime(2017, 10, 2, 18, 48, 8),

...

1️⃣0️⃣ โจทย์ต้องการให้นับจำนวนที่เป็นช่วงเวลาเช้า (AM) แยกจาก ช่วงเวลาค่ำ (PM) ที่อยู่ในชุดข้อมูลนี้

ซึ่ง (AM/PM) เป็นระบบเวลา 12 ชั่วโมง (12-hour clock)

# Create dictionary to hold results
trip_counts = {'AM': 0, 'PM': 0}
  
# Loop over all trips
for trip in onebike_datetimes:
  # Check to see if the trip starts before noon
  if trip['start'].hour < 12:
    # Increment the counter for before noon
    trip_counts['AM'] += 1
  else:
    # Increment the counter for after noon
    trip_counts['PM'] += 1
  
print(trip_counts)

## Result ##

{'AM': 94, 'PM': 196}

1️⃣1️⃣ รูปแบบในการแสดงผลของ วันที่และเวลา

ที่ได้เกริ่นไปในตอนที่ 1 ว่า ข้อมูล datetime object สามารถที่จะแปลง format เป็น standard ต่างๆ ได้ เช่น format iso ตัวอย่างเช่น

from datetime import datetime

dt = datetime(year=2017, month=10, day=1, hour=15, minute=26, second=26)

# Print the results in ISO 8601 format
print(dt.isoformat())

## Result ##

2017-10-01T15:26:26

1️⃣2️⃣ การแปลงข้อมูล วันที่และเวลา parsing datetime นอกจากการแปลงใน format iso แล้ว เราสามารถที่จะปรับเปลี่ยนรูปแบบการแสดงผลต่างๆ ให้เป็นไปตามที่ต้องการใน format ของ python ที่กำหนด โดยการใช้ method ที่ชื่อ strftime() ยกมากจาก string formate time ยกตัวอย่างเช่น

date3 = datetime(2017, 10, 1, 15, 23, 25)
print(date3.strftime("%Y-%m-%d")

## Result ##

2017-10-1

1️⃣3️⃣ การใช้ method strftime() จะรับค่าในรูปแบบเป็น format string ซึ่งจะต้องบอก Python ว่าควรจัดรูปแบบ วันที่และเวลา อย่างไร

1️⃣4️⃣ รหัสรูปแบบต่อไปนี้

  • %Y: ปีสี่หลัก
  • %m: เดือนสองหลัก
  • %d: วันของเดือนสองหลัก
  • %H: ชั่วโมง (นาฬิกา 24 ชั่วโมง)
  • %M: นาที
  • %S: วินาที
date4 = datetime(2017, 10, 1, 15, 23, 25)
print(date4.strftime("%Y-%m-%d %H:%M:%S")

## Result ##

2017-10-01 15:23:25

1️⃣5️⃣ หรือ

date5 = datetime(2017, 10, 1, 15, 23, 25)
print(date5.strftime("%H:%M:%S on %Y/%m/%d")

## Result ##

15:23:25 2017/10/01

1️⃣6️⃣ นอกจากนี้ ยังมี method ที่ชื่อว่า strptime() ย่อมาจาก string parse time ซึ่งจะต่างกับ strftime ตรงที่การรับค่า strftime จะเป็นการสร้างข้อมูล วันที่และเวลา จาก Object datetime แล้วนำค่ามาแปลงด้วย format string แต่ ส่วน strptime นั้นจะ รับค่ารูปแบบ string รูปแบบต่างๆ มา parse ให้เป็น string format รูปแบบที่กำหนด เช่น

from datetime import datetime

# Starting string, in YYYY-MM-DD HH:MM:SS format
s = '2017-02-03 00:00:01'

# Write a format string to parse s
fmt = '%Y-%m-%d %H:%M:%S'

# Create a datetime object d
d = datetime.strptime(s, fmt)

# Print d
print(d)

## Result ##

2017-02-03 00:00:01

1️⃣7️⃣ datetime duration

ใน datetime สามารถที่จะคำนวนได้ เราจึงใน บวก ลบ ได้อย่างอิสระ เพื่อใช้สำหรับเปรียบเทียบอย่างเช่นการใช้ method ที่ชื่อ timedelta ซึ่งจะได้ค่าที่คำนวนออกมาเป็น duration หรือ ระยะเวลา รวมถึงการใช้ method ที่ชื่อ total_second สำหรับนับจำนวนเวลาวินาทีทั้งหมดใน duration

1️⃣8️⃣ ยกตัวอย่างเช่น เพิ่มเวลาไป 1 วินาที ลงไปใน method timedelta เพื่อทำการเพิ่มเวลาให้กับ start date

from datetime import datetime

start = datetime(2023, 11, 14, 20, 10, 33)
end = datetime(2023, 11, 14, 20, 35, 43)

# Create a timedelta object representing one second in duration.
delta1 = datetime.timedelta(seconds=1)

# Add delta1 to start to get a new datetime object that is one second later.
new_datetime = start + delta1

print(new_datetime)

## Result ##

2023-11-14 20:10:34

1️⃣9️⃣ และ นับวินาทีทั้งหมดที่ได้ใช้ไป จากเวลาสิ้นสุด ลบด้วย เวลาเริ่มต้น โดยทำเป็น duration แล้วดูวินาทีด้วย total_second

from datetime import datetime

start = datetime(2023, 11, 14, 20, 10, 33)
end = datetime(2023, 11, 14, 20, 35, 43)

# Create a timedelta object representing the elapsed time between start and end.
delta = end - start

# Get the total number of seconds in the timedelta.
total_seconds = delta.total_seconds()

print(total_seconds)

## Result ##

1450.0

2️⃣0️⃣ ยกตัวอย่างการใช้ เช่น โจทย์บอกว่า ต้องการจะรู้ค่าสถิติระยะเวลาการใช้งาน จักรยานเช่า ว่าเป็นเท่าไรที่ dataset แบบนี้

onebike_datetimes

[{'start': datetime.datetime(2017, 10, 1, 15, 23, 25),
  'end': datetime.datetime(2017, 10, 1, 15, 26, 26)},
 {'start': datetime.datetime(2017, 10, 1, 15, 42, 57),
  'end': datetime.datetime(2017, 10, 1, 17, 49, 59)},
 {'start': datetime.datetime(2017, 10, 2, 6, 37, 10),
  'end': datetime.datetime(2017, 10, 2, 6, 42, 53)},
 {'start': datetime.datetime(2017, 10, 2, 8, 56, 45),

2️⃣1️⃣ เราสามารถที่จะสร้าง array ตัวใหม่ขึ้นมา

# Initialize a list for all the trip durations
onebike_durations = []

for trip in onebike_datetimes:
  # Create a timedelta object corresponding to the length of the trip
  trip_duration = trip['end'] - trip['start']
  
  # Get the total elapsed seconds in trip_duration
  trip_length_seconds = trip_duration.total_seconds()
  
  # Append the results to our list
  onebike_durations.append(trip_length_seconds)

## Result ##

[181.0,
 7622.0,
 343.0,
 1278.0,

...

2️⃣2️⃣ แล้วนำมาหาค่าเฉลี่ย


# What was the total duration of all trips?
total_elapsed_time = sum(onebike_durations)

# What was the total number of trips?
number_of_trips = len(onebike_durations)
  
# Divide the total duration by the number of trips
print(total_elapsed_time / number_of_trips)

##

1178.9310344827586


1️⃣0️⃣0️⃣  โดยสรุป ข้อมูลประเภทวันที่และเวลา (Datetime) เป็นข้อมูลประเภทวันที่และเวลามีอยู่รอบตัวเรา ถ้าอยากใช้ประโยชน์การวิเคราะห์ข้อมูลเชิงลึก จำเป็นต้องรู้เครื่องมือที่สามารถสร้างภาพต่างๆ ด้วยวันที่และเวลาได้ ที่ประกอบไปด้วยวิธีจัดการต่างๆ เช่น

  • การสร้าง datetime Object
  • การแก้ไขข้อมูล datetime
  • การแปลงข้อมูล วันที่และเวลา ตามรูปแบบที่กำหนด
  • การใช้ method ในการคำนวนระยะเวลา duration


1️⃣0️⃣0️⃣ ขอขอบคุณผู้อ่านทุกท่านที่ติดตาม โปรดติดตามตอนต่อไป และสนันสนุนผู้เขียน เพื่อเป็นกำลังใจและค่า web server แก่ผู้เขียน ด้วยการกด google ads ทั้งด้านข้างและระหว่างบทสัก 2-3 click ให้ด้วยนะครับ กดฟรีไม่เสียเงิน —> เหตุผลที่ต้อง click google ads ให้ผู้เขียน




สรุปการเขียน Code จัดการ timezone ครบจบใน Python ตอนที่ 3



1️⃣ จากตอนที่ 1 และ ตอนที่ 2 ได้เขียนสรุปวิธีการใช้ datetime object เช่น การสร้าง datetime Object การแก้ไขข้อมูล datetime การแปลงข้อมูล วันที่และเวลา ตามรูปแบบที่กำหนด การใช้ method ในการคำนวนระยะเวลา duration ซึ่งสามารถนำไปประยุกต์ใช้ในการจัดการข้อมูลวันที่และเวลาได้ สามารถอ่านย้อนหลัง ตอนที่ 1 และ ตอนที่ 2ได้ ที่ link นี้


2️⃣ Timezone UTC

อย่างที่ทุกคนทราบกันดีว่า ทั่วโลกมีเวลาที่แตกต่างกัน เป็นข้อตกลงของของรัฐบาลโลกในช่วงที่สร้างข้อตกลงเรื่อง timezone เพื่อให้ผู้คนทั้งโลกเข้าใจตรงกัน เวลาที่ถูกถึงวันเวลาของประเทศนั้นๆ

3️⃣ ทำไมเรื่อง timezone จึงเกิดขึ้น

ก่อนที่จะมี timezone เมืองทุกเมืองก็มี นาฬิกาเป็นตัวเองโดยให้ เวลาเที่ยงตรงหรือ 12.00 น. เกิดจากดวงอาทิตย์อยู่กลางหัว

4️⃣ ในกรณีนี้ ทำให้เกิดเหตุการณ์ เวลาของแต่ละเมืองแตกต่างกัน อาจจะ 15 นาที หรือ 20 นาที ขึ้นอยู่กับว่าแต่ละเมืองห่างกันเท่าไร ในช่วงเวลานั้นมีแค่การเดินทางกับรถม้า ก็เลยไม่รู้สึกแตกต่างอะไรเท่าไร

5️⃣ แต่หลังจากที่เทคโนโลยีก้าวหน้าเป็นอย่างมากไม่ว่าจะ มีรถไฟ เครื่องบิน โทรศัพท์ เป็นต้น ในเรื่องของการสื่อสารและการเดินทาง ทำให้เกิดความแตกต่างเรื่องเวลาขึ้นอย่างชัดเจน

  • ——————— *

  • 1️⃣0️⃣0️⃣ หากใครไม่อยากพลาด *

  • โพสต์เรื่องเกี่ยวกับ *

  • data analyst, data science, *

  • data engineer และ programming *

  • ในโพสต์ถัดๆไป ฝากแชร์ *

  • กดติดตาม profile กันไว้ด้วยนะครับ *

  • https://www.sklsongkiat.com *

  • *——————— **

6️⃣ รัฐบาลอังกฤษได้เสนอในรัฐบาลทั่วโลกแก้ปัญหานี้ โดยประกาศว่านาฬิกาทั้งหมดของแต่ละพื้นที่ ตกลงกันในเรื่องของชั่วโมง ว่าจะเพิ่ม หรือ ลดลงจากดวงอาทิตย์ที่ประเทศอังกฤษ

7️⃣ โดยปัจจบันเรากำหนดจุดเริ่มต้นของเวลามาตรฐานโลกที่ชื่อว่า UTC ย่อมาจาก Universal Time Coordinate ตั้งเอาไว้ที่กรุงลอนดอน ประเทศอังกฤษ ซึ่งหมายความว่า กรุงลอนดอนมีค่า UTC เท่ากับ 0 เมืองอื่นๆ ที่อยู่ทางด้านซ้าย หรือ ทางด้านตะวันตกของประเทศอังกฤษตามแผนที่โลกกำหนดให้ค่า UTC ลดลงและเมืองอื่นๆ ทางด้านตะวันออกกำหนดให้ UTC เพิ่มขึ้น

8️⃣ ยกตัวอย่างเช่น ประเทศไทย ที่อยู่ทางด้านตะวันออกของประเทศอังกฤษ จะมีเวลา UTC เท่ากับ +7 หมายความว่า ถ้าประเทศอังกฤษเวลา เที่ยงคืน 00:00 น. ประเทศไทยจะมีเวลาที่ เจ็ดโมงเช้า 07:00

9️⃣ กลับมาที่เรื่องของ การใช้ python จัดการวันที่และเวลา จากความรู้ตรงนี้ ในการจัดการข้อมูล วันที่และเวลา จำเป็นต้องเข้าใจก่อนว่ามีเรื่องที่จะต้องแปลง เปลี่ยน timezone ไปมาระหว่างแต่ละประเทศเพื่อที่จะทราบเวลาของเหตุการณ์ที่แน่นอนว่าเกิดอะไรขึ้น

1️⃣0️⃣ วันที่และเวลาที่สร้างจาก datetime object จะถูกเรียกว่า “naive” ซึ่งหมายถึง เป็น เวลาที่ถูกสร้างขึ้นมาโดยที่ไม่ได้กำหนด timezone จึงไม่สามารถนำไปเปรียบเทียบกับเวลาอื่นๆได้

1️⃣1️⃣ ดังนั้นเราจะมาเรียนรู้ว่าเครื่องมือที่ใช้จัดการ timezone มีอะไรบ้าง

ยังคงพูดถึง datetime library กันอยู่ ซึ่งมี class ที่หลากหลาย ที่จะพูดถึงในตอนนี้ คือ timedelta และ timezone

1️⃣2️⃣ timezone เป็น class ที่สร้าง object โดยระบุตัวเลขของ timezone เพื่อไปกำหนดให้กับ datatime object อีกทีหนึ่ง ยกตัวอย่างเช่น กำหนด timezone เป็น US Eastern Standard และ India Standard

1️⃣3️⃣ US Eastern Standard

from datetime import datetime, timedelta, timezone

ET = timezone(timedelta(hours=-5))

dt = datetime(2017, 12, 30, 15, 9, 3 tzinfo = ET)

print(dt)

## Result ##
2017-12-30 15:09:03-05:00

1️⃣4️⃣ India Standard

from datetime import datetime, timedelta, timezone

ET = timezone(timedelta(hours=5, minutes=30))

dt = datetime(2017, 12, 30, 15, 9, 3 tzinfo = ET)

print(dt)

## Result ##
2017-12-30 15:09:03+05:30

1️⃣5️⃣ และ ถ้าหากเราต้องการจะแปลงกลับมาเป็นประเทศของตัวเอง เราสามารถที่จะใช้ method astimezone ร่วมกับการเปลี่ยนค่า timezone ด้วย timezone.utc ในการ setting ให้ค่าที่แปลง timezone ออกไปตัวอย่างก่อนหน้านี้ เช่น

1️⃣6️⃣ ถ้าเราใช้ method replace ร่วมกับ timezone.utc มันจะเปลี่ยนแค่เฉพาะ timezone ด้านหลัง สังเกตว่าเวลาไม่เปลี่ยน

print(dt)
2017-12-30 15:00:00+05:00

print(dt.replace(tzinfo=timezon.utc))

## Result ##
2017-12-30 15:00:00+00:00:00

1️⃣7️⃣ แต่ถ้าใช้ astimezone เวลาจะเปลี่ยนไปเป็น 10:00

print(dt.astimezone(tzinfo=timezon.utc))

## Result ##
2017-12-30 10:00:00+00:00:00

1️⃣8️⃣ Timezone Database

ณ ตอนนี้ ได้เข้าใจแล้วว่า UTC ทำงานอย่างไร ประเด็นถัดมา คือ Time Zone ไม่ได้แบ่งแค่ทวีป อย่าง ทวีปเอเชีย หรือ ทวีปยุโรปเท่านั้น แต่ Timezone ในบางประเทศอย่าง สหรัฐอเมริกา ก็มี Timezone ที่แตกต่างกัน คราวนี้ จะรู้ได้อย่างไรว่าข้อมูลวันที่และเวลาแต่ละพื้นที่นั้นถูกต้องตาม UTC จริงๆ ที่เป็น Standard

1️⃣9️⃣ แน่นอนว่า ข้อมูลที่แตกต่างกันมาก ไม่สามารถจำได้ทั้งหมด จะต้องหาที่รวบรวม ดังนั้น โลกจึงมีฐานข้อมูลที่เก็บ Timezone โดยเฉพาะ และ Update 3 ถึง 4 ครั้งต่อปี เมื่อกฏ Timezone ของโลกเปลี่ยนแปลง

2️⃣0️⃣ ยกตัวอย่างเช่น ทางชายฝั่งทะเลตะวันตกของสหรัฐ จะใช้ timezone ที่ชื่อว่า ‘America/New York’ 'America/Mexico_City' หรือทวีปอื่นๆ เช่น 'Europe/London'. 'Africa/Accra'.

2️⃣1️⃣ สิ่งนี้ช่วยอะไรกับเรา

  • เขตเวลาสามารถเปรียบเทียบเวลาข้ามทวีปและประเทศต่างๆได้
  • ฐานข้อมูลช่วยให้สามารถรักษาข้อมูลเวลาและมีความถูกต้อง
  • สามารถปรับเวลา UTC จากตัวอย่างก่อนหน้านี้ได้อย่างยืดหยุ่น

2️⃣2️⃣ ตัวอย่างการใช้ timezone

from datetime import datetime
from dateutil import tz

et = tz.gettz('America/Mexico_City')

lasttime = datetime(2017, 12, 30, 15, 0, 0, tzinfo=et)

print(lasttime)

## Result ##
2017-12-30 15:00:00-05:00

2️⃣3️⃣ Starting Daylight saving time

มาทำความรู้จักกับคำว่า Daylight saving time (DST) บ้างก็เรียกว่า “เวลาอ้อมแสง” บางประเทศ ก็เรียกว่า “ลือดูร้อน”

เดี๋ยวววว “ฤดูร้อน”

2️⃣4️⃣ ทำไมถึงมีเรื่องของเวลาอ้อมแสง อาจจะยังไม่เข้าใจความหมายของคำๆ นี้ ซึ่งในบางประเทศ ฤดูกาลมีผลกระทบต่อการขึ้นลงของดวงอาทิตย์ ทำให้แสงแดดยาวนานกว่าปกติ ก็คือ “ฤดูร้อน” มันทำให้มีผลกระทบต่อการตื่นนอนด้วย จึงได้มีข้อตกลงว่า ในเมื่อต้องตื่นตามดวงอาทิตย์ขึ้น งั้นก็ปรับเวลาในให้เร็วขึ้น 1 ชั่วโมงจะได้ทำงานได้เร็วขึ้น หลังจากที่สิ้นสุดหน้าร้อน ก็ค่อยปรับเวลากลับ 1 ชั่วโมงตามปกติ ซึ่งก็จะเป็นช่วงเข้าฤดูหนาว

2️⃣5️⃣ changing DST with UTC offset

ถ้าลองพิสูจน์ดูว่า datetime object ข้อมูลวันที่และเวลา ด้วย UTC จะเป็นอย่างไร

spring_ahead_159am = datetime(2017, 3, 12, 1, 59, 59)

print(sprint_ahead_159am.isoformat())

## Result ## 
2017-03-12T01:59:59

2️⃣6️⃣

spring_ahead_3am = datetime(2017, 3, 12, 3, 0, 0)

print(sprint_ahead_3am.isoformat())

## Result ## 
2017-03-12T03:00:00

2️⃣7️⃣ ถ้าลองเอาเวลาทั้งสองมาลบกัน จะเห็นว่ามีค่าเท่ากับ 3601 วินาที หรือ 1 ชั่วโมงกับอีก 1 วินาที

print((spring_ahead_3am - spring_ahead_159am).total_seconds())

## Result ##
3601

2️⃣8️⃣ คราวนี้มาลองพิสูจน์ดูว่า datetime object ข้อมูลวันที่และเวลา ด้วย timezone จะเป็นอย่างไร

โดยกำหนด timezone เป็นตัวแปร EST และ EDT

EST = timezone(timedelta(hours=-5))
EDT = timezone(timedelta(hours=-4))

2️⃣9️⃣ EST Timezone

spring_ahead_159am = spring_ahead_159am.replace(tzinfo = EST)

print(sprint_ahead_159am.isoformat())

## Result ## 
2017-03-12T01:59:59-05:00

3️⃣0️⃣ EDT Timezone

spring_ahead_3am = spring_ahead_3am.replace(tzinfo = EDT)

print(sprint_ahead_3am.isoformat())

## Result ## 
2017-03-12T03:00:00-04:00

3️⃣1️⃣ เมื่อเอามาลบกันอีกครั้ง เหลือเพียง 1 วินาที

print((spring_ahead_3am - spring_ahead_159am).total_seconds())

## Result ##
1

3️⃣2️⃣ Ending Daylight saving time

อย่างที่เกริ่นเอาไว้ เมื่อหมด ฤดูร้อนแล้ว ก็เข้าสู่ฤดูใบไม้ร่วงและฤดูหนาว จะปรับเวลากลับมาเป็นเหมือนเดิม แต่จะปรับกลับอย่างไร

3️⃣3️⃣ changing DST Back 1 hour

วิธีคือให้ปรับกลับมาโดยใช้ enford method ตัวอย่างเช่น เวลาตี 1 ของ timezone 'US/Eastern'

eastern = tz.gettz('US/Eastern')

first_1am = datetime(2017, 11, 5, 1, 0, 0, tzinfo=eastern)

## Result ##
2017-11-05 01:00:00

3️⃣4️⃣ วิธีเช็คว่า datetime มีความไม่ชัดเจนหรือไม่ (ambiguous) และ เช็คด้วยจำนวนวินาที

print(tz.datetime_ambiguous(first_1am))

## Result ##
True

3️⃣5️⃣ สร้าง datetime ขึ้นอีก object เพื่อเปรียบเทียบ แล้วใช้ method enford ปรับค่า


second_1am = datetime(2017, 11, 5, 1, 0, 0, tzinfo=eastern)

second_1am = tz.enford(second_1am)

3️⃣6️⃣ แล้วแปลงกลับ ด้วย UTC ซึ่งต้องเป็น UTC เหมือนกัน

first_1am = first_1am.astimezone(tz.UTC)
second_1am = second_1am.astimezone(tz.UTC)

3️⃣7️⃣ ทดสอบ

print((first_1am - second_1am).total_seconds())

## Result ##
3600


1️⃣0️⃣0️⃣  โดยสรุป เราได้เรียนรู้เรื่อง timezone และวิธีการจัดการวันที่และเวลาเพื่อนำไปจัดการกับข้อมูลวันที่และเวลาที่อาจจะไม่ใช่ timezone ประเทศของตัวเอง เพื่อความถูกต้องของข้อมูล


1️⃣0️⃣0️⃣ ขอขอบคุณผู้อ่านทุกท่านที่ติดตาม โปรดติดตามตอนต่อไป และสนันสนุนผู้เขียน เพื่อเป็นกำลังใจและค่า web server แก่ผู้เขียน ด้วยการกด google ads ทั้งด้านข้างและระหว่างบทสัก 2-3 click ให้ด้วยนะครับ กดฟรีไม่เสียเงิน —> เหตุผลที่ต้อง click google ads ให้ผู้เขียน





สรุปการเขียน Code จัดการวันที่และเวลาด้วย Pandas ครบจบใน Python ตอนที่ 4 (จบ)



1️⃣ จากตอนที่ 1 ตอนที่ 2 ได้เรียนรู้เครื่องมือจัดการวันที่และเวลา ส่วนตอนที่ 3 ได้เขียนถึงเรื่อง timezone ที่จำเป็นต้องรู้ สามารถอ่านย้อนหลัง ตอนที่ 1 ตอนที่ 2 และ ตอนที่ 3 ได้ ที่ link นี้
 

Table of Content


2️⃣ สำหรับตอนที่ 4 ตอนสุดท้ายนี้ จะ advance เพิ่มขึ้นมาอีกสักเล็กน้อยในการใช้เครื่องมือการวิเคราะห์ข้อมูลวันที่และเวลาอย่าง Pandas (แพนด้าส) ผู้สอนบางท่าน อ่านว่า แพนด้า ???? เราจะมาดูกันว่ามีขั้นตอนอะไร หรือ เทคนิคอะไรบ้างที่ใช้จัดการข้อมูลวันที่และเวลา

3️⃣ Pandas Datetime

pandas ได้พูดถึงไปบ้างแล้วในบทก่อนๆ ซึ่งเป็นเครื่องมือที่ช่วยวิเคราะห์ข้อมูล สำหรับบทนี้ก็จะมาเรียนรู้วิธีการจัดการข้อมูลวันที่และเวลาด้วย pandas

4️⃣ เราจะมาดูกับปัญหาตัวอย่างที่จะต้องจัดการกับเวลากัน

ถ้าเรามีชุดข้อมูลอย่าง capital-onebike.csv เป็นข้อมูลตัวอย่างที่พูดในการใช้ pandas วิเคราะห์ข้อมูล สำหรับ pandas มี method สำหรับ อ่านข้อมูล csv เมื่ออ่านแล้ว จาก code ตัวอย่าง ด้านล่างจะเห็นว่ามี argument parse_dates อยู่

5️⃣ parse_dates สามารถที่จะ convert เป็น datetime object ได้ทันทีเมื่ออ่านด้วย read_csv ถ้าไม่ใส่เวลา output ออกมาแสดงค่าเหมือนกันก็จริงแต่ว่า เป็นแค่ string ไม่สามารถนำไปใช้งานต่อได้

# Import pandas
import pandas as pd

# Load CSV into the rides variable
rides = pd.read_csv('capital-onebike.csv', 
                    parse_dates = ['Start date', 'End date'])

  • ——————— *

  • 1️⃣0️⃣0️⃣ หากใครไม่อยากพลาด *

  • โพสต์เรื่องเกี่ยวกับ *

  • data analyst, data science, *

  • data engineer และ programming *

  • ในโพสต์ถัดๆไป ฝากแชร์ *

  • กดติดตาม profile กันไว้ด้วยนะครับ *

  • https://www.sklsongkiat.com *

  • *——————— **

6️⃣ เริ่มสำรวจข้อมูลกันสักเล็กน้อย จะเห็นว่าข้อมูลทั้งหมด มีอยู่ 290 แถว และ 8 คอลัมน์

print(rides)

## Result ##
Start date            End date  Start station number                                      Start station  End station number                                        End station  \\
0   2017-10-01 15:23:25 2017-10-01 15:26:26                 31038                               Glebe Rd & 11th St N               31036                      George Mason Dr & Wilson Blvd   
1   2017-10-01 15:42:57 2017-10-01 17:49:59                 31036                      George Mason Dr & Wilson Blvd               31036                      George Mason Dr & Wilson Blvd   
2   2017-10-02 06:37:10 2017-10-02 06:42:53                 31036                      George Mason Dr & Wilson Blvd               31037               Ballston Metro / N Stuart & 9th St N   
3   2017-10-02 08:56:45 2017-10-02 09:18:03                 31037               Ballston Metro / N Stuart & 9th St N               31295                                  Potomac & M St NW   
4   2017-10-02 18:23:48 2017-10-02 18:45:05                 31295                                  Potomac & M St NW               31230                      Metro Center / 12th & G St NW   
...
[290 rows x 8 columns]

7️⃣ ยังอาจจะดูยากอยู่ ลองดึงข้อมูลออกมาดูสัก 1 แถว

# Print the initial (0th) row
print(rides.iloc[0])

## Result ##

Start date                        2017-10-01 15:23:25
End date                          2017-10-01 15:26:26
Start station number                            31038
Start station                    Glebe Rd & 11th St N
End station number                              31036
End station             George Mason Dr & Wilson Blvd
Bike number                                    W20529
Member type                                    Member
Name: 0, dtype: object

8️⃣หรือ อาจจะใช้ method ที่ชื่อ to_datetime มันก็จะช่วยแปลงข้อมูลวันที่ ให้เป็น datetime object ตามที่เรากำหนด format string ลงไป เช่น

rides['Start date'] = pd.to_datetime(rides['Start date'],
												format = "%Y-%m-#d %H:%M:%S")

9️⃣ สมมติว่าโจทย์ของเราต้องการจะรู้ว่า เวลารวมในการจอดจักรยานตั้งแต่เริ่มจนสิ้นสุด ของข้อมูลทั้งหมด

เนื่องจาก Start date และ End date ที่ถูก convert สามารถแปลงเป็น timedelta ได้ เพราะเป็นdatetime แล้วถ้าเราลองเอาค่า rides['Start date'] มา print ดูจะเห็นว่ามี Timestamp ห่อหุ้มอย

print(rides['Start date'].iloc[2])

## Result ##

Timestamp('2017-10-02 06:37:10')

1️⃣0️⃣ ดังนั้นเราสามารถนำ start date และ end date นำมาคำนวนกันได้ทันที

# Subtract the start date from the end date
ride_durations = rides['End date'] - rides['Start date']

## Result ##

0     0 days 00:03:01
1     0 days 02:07:02
2     0 days 00:05:43
3     0 days 00:21:18
4     0 days 00:21:17
...      
Length: 290, dtype: timedelta64[ns]

1️⃣1️⃣ ถ้าเราอยากรู้เวลารวมที่เป็นวินาทีก็ใช้ method dt.total_seconds()

# Convert the results to seconds
rides['Duration'] = ride_durations.dt.total_seconds()

print(rides['Duration'].head())

## Result ##

0     181.0
1    7622.0
2     343.0
3    1278.0
4    1277.0
Name: Duration, dtype: float64

1️⃣2️⃣ summerizing datetime in pandas

การสรุปข้อมูลก็คือการนำข้อมูลมาหาคำอธิบายด้วยค่าทางสถิติ อย่างบทก่อนๆ เช่น mean sum max min เราจะเอาวิธีทางสถิติมาสรุปข้อมูลวันที่และเวลาด้วย pandas

1️⃣3️⃣ วิธีการสรุปข้อมูลด้วย pandas สำหรับข้อมูลที่เป็นวันที่และเวลา สามารถที่จะเรียก mean() median() หรือ sum() ก็ได้ ยกตัวอย่างเช่น ต้องการหาค่าเฉลี่ยของ ช่วงเวลาที่รถจักรยานหมดเวลาจอดแต่ยังคงจอดอยู่

rides['Duration'].mean()

## Result ##
Timedelta('0 days 00:19:38.35456456456')

1️⃣4️⃣ ในกรณีที่เราจะสรุปข้อมูลจัดกลุ่มข้อมูล ที่ไม่ใช่ตัวเลข สามารถที่จะใช้ method value_counts() เพื่อหาผลรวมแยกตามประเภทของข้อความได้เช่น

rides['Member type'].value_counts()

## Result ##
Member 236
Casual 54
Name: Member type, dtype: int64

1️⃣5️⃣ หรือต้องการหาค่าเฉลี่ยของแต่ละประเภทก็นำ method len() หรือ ความยาวของข้อมูลเพื่อ ดูจำนวนรวม ทั้งหมด มาหารเพื่อได้ค่าเฉลี่ย

rides['Member type'].value_counts() / len(rides)

## Result ##

Member 0.814
Casual 0.186
Name: Member type, dtype: float64

1️⃣6️⃣ ที่ผ่านมาเราจัดกลุ่มตามประเภทของคำ สำหรับวันที่และเวลา หรือ datetime ก็สามารถจัดกลุ่มได้เช่นเดียวกัน โดยใช้ method resample เช่น

rides.resample('M', on='Start date')['Duration seconds'].mean()

## Result ##

Start date 
2017-10-31 1886.454
2017-11-30 854.175
2017-12-31 635.101
Freq: M, Name: Duration seconds, dtype: float64

1️⃣7️⃣ resample สามารถที่จะกำหนด ข้อมูลจัดกลุ่ม วันที่และเวลา เป็นรายเดือน รายวัน หรือ รายอาทิตย์จากการกำหนด ‘D’, ‘M’, ‘W’ และ สามารถที่จะนำ resample method มา plot กราฟด้วย matplotlib อย่างเร็วๆได้ทันที

rides\\
	.resample('D', on='Start date')\\
	['Duration seconds']
	.mean()\\
	.plot()




1️⃣8️⃣

rides\\
	.resample('M', on='Start date')\\
	['Duration seconds']
	.mean()\\
	.plot()




1️⃣9️⃣ Addition datetime in pandas

advance ขึ้นมาอีกเล็กน้อย กับการจัดการ timezone ด้วย pandas

ยกตัวอย่างการคำนวนจำนวนวินาทีใช้ทั้งหมด จาก method ที่ผ่านมา total_seconds เพื่อดูค่าเวลาต่ำสุดของ column Duration จะเห็นว่าเป็นค่าติดลบ ซึ่งมันไม่ถูกต้อง

rides['Duration'].dt.total_seconds().mean()

## Result ##
-3346.0

2️⃣0️⃣ เหตุผลก็เพราะว่า datetime นี้ยังเป็นค่า naive ที่ยังไม่มีข้อมูล timezone หรือ อาจจะเป็นเวลา อ้อมแสง ที่ยังไม่ถูกต้อง สังเกตที่ท้ายเวลา จะไม่มี timezone เช่น +07:00

rides['Start date'].head(3)
2017-10-01 15:23:25
2017-10-01 15:42:57
2017-10-02 06:37:10
Name: Start date, dtype: datetime64[ns]

2️⃣1️⃣ จะต้องปรับค่า timezone ให้เป็นระบบ UTC เสียก่อน โดย pandas มี mathod dt.tz_localize() สำหรับแปลง datetime ให้เป็น UTC

rides['Start date'] = rides['Start date'].dt.tz_localize('America/New_York')

## Result ##

2017-10-01 15:23:25-04:00
2017-10-01 15:42:57-04:00
2017-10-02 06:37:10-04:00
Name: Start date, dtype: datetime64[ns, America/New_York]

2️⃣2️⃣ ถ้าเราอยากรู้ว่า จำนวนแต่ละะวันมีระยะเวลาใช้จักรยานจำนวนเท่าไร เราสามารถเขียนแบบนี้ได้

# Add a column for the weekday of the start of the ride
rides['Ride start weekday'] = rides['Start date'].dt.day_name()

# Print the median trip time per weekday
print(rides.groupby('Ride start weekday')['Duration'].median())

## Result ##

Ride start weekday
Friday       724.5
Monday       810.5
Saturday     462.0
Sunday       902.5
Thursday     652.0
Tuesday      641.5
Wednesday    585.0
Name: Duration, dtype: float64


1️⃣0️⃣0️⃣ โดยสรุป การวิเคราะห์ข้อมูลเวลา สามารถนำข้อมูลเข้า pandas เพื่อวิเคราะห์ข้อมูลได้หลากหลาย รวมถึง วันที่และเวลา สามารถที่วิเคราะห์จาก pandas ที่เดียวเพิ่มความสะดวกได้ทันที


1️⃣0️⃣0️⃣ ขอขอบคุณผู้อ่านทุกท่านที่ติดตาม โปรดติดตามตอนต่อไป และสนันสนุนผู้เขียน เพื่อเป็นกำลังใจและค่า web server แก่ผู้เขียน ด้วยการกด google ads ทั้งด้านข้างและระหว่างบทสัก 2-3 click ให้ด้วยนะครับ กดฟรีไม่เสียเงิน —> เหตุผลที่ต้อง click google ads ให้ผู้เขียน


Table of Content

แวะมาทักทายกันได้
donate