นโยบายการจัดการความรู้ มหาวิทยาลัยสงขลานครินทร์ 1.ให้ใช้เครื่องมือการจัดการความรู้ผลักดัน คุณภาพคน และกระบวนทำงาน 2.ส่งเสริมการแลกเปลี่ยนประสบการณ์การทำงาน จากหน้างาน 3.ส่งเสริมให้มีเวทีเรียนรู้ร่วมกัน

Our Shangri-La
Ico64
Kittisakdi Choomalee

ภาควิชาเวชศาสตร์ชุมชน คณะแพทยศาสตร์ มหาวิทยาลัยสงขลานครินทร์
เครือข่าย
สมาชิก · ติดตาม: 0 · ผู้ติดตาม: 16

อ่าน: 1410
ความเห็น: 2

ก้าวย่างทางเดิน ลืมเลือนคืนวัน ดั้นด้นไป: วันที่สับสน ๒๔ [C]

วันที่สับสน คนทำ (ข้อมูล) เวียนหัว

รวมลิงค์บันทึกที่เกี่ยวข้อง

 

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

 

จากตัวอย่างนี้ครับ

> test.date[,4:9]
      tmp.date  tmp.date2  tmp.date3 tmp.date.dif tmp.y.4 tmp.y.100
1   2507-01-14 1964-01-10 1964-01-14   -3.75 days       3         7
2   2508-12-20 1965-12-16 1965-12-20   -3.75 days       0         8
3   2509-11-24 1966-11-20 1966-11-24   -3.75 days       1         9
4   2510-02-07 1967-02-03 1967-02-07   -3.75 days       2        10
5   2511-06-05 1968-05-31 1968-06-05   -4.75 days       3        11
6   2512-02-13 1969-02-08 1969-02-13   -4.75 days       0        12
7   2513-03-25 1970-03-21 1970-03-25   -3.75 days       1        13
8   2514-02-07 1971-02-03 1971-02-07   -3.75 days       2        14
9   2515-01-16 1972-01-12 1972-01-16   -3.75 days       3        15
10  2516-07-03 1973-06-29 1973-07-03   -3.75 days       0        16

 

ที่แน่ ๆ ก็คือข้อมูลในตัวแปร tmp.y.4 และตัวแปร tmp.y.100

 

เพราะอะไรหรือครับ

 

ก็เพราะว่า

 

ตัวแปรที่ ๕ (tmp.y.4) เป็นข้อมูลเศษเมื่อนำข้อมูลปีจากตัวแปร tmp.y ซึ่งเป็นปี พ.ศ. (แต่ระบบรับรู้ว่าเป็นปี ค.ศ.) มาหารด้วย ๔ เศษเท่ากับ ๐ คือปีนั้นหารด้วย ๔ ลงตัว

 

ตัวแปรที่ ๖ (tmp.y.100) เป็นข้อมูลเศษเมื่อนำข้อมูลปีจากตัวแปร tmp.y ซึ่งเป็นปี พ.ศ. (แต่ระบบรับรู้ว่าเป็นปี ค.ศ.) มาหารด้วย ๑๐๐ เศษเท่ากับ ๐ คือปีนั้นหารด้วย ๑๐๐ ลงตัว

 

จากข้อมูลของ ๒ ตัวแปรข้างต้นเป็นข้อมูลที่ตรวจสอบว่าปี ของข้อมูลต้นฉบับที่เป็น พ.ศ. แต่ระบบมองเป็นปี ค.ศ. นั้น ปีไหนเป็นปีอธิกสุรทินบ้าง

 

แล้วนำมาใช้เพื่อตรวจสอบสิ่งที่เราต้องการไม่ได้

 

สิ่งที่เราต้องการก็คือจำนวนวันที่ต่างกันระหว่างวันที่ที่เกิดจากการเอาวันที่ต้นฉบับ (ปีเป็น พ.ศ.) มาลบด้วย ๕๔๓ x ๓๖๕.๒๕ กับวันที่ที่เกิดจากการแยกวัน เดือน ปี จากข้อมูลต้นฉบับและนำข้อมูลมารวมกันเป็นข้อมูลวันที่อีกครั้งโดยใช้ ๕๔๓ ลบข้อมูลปีก่อนที่จะนำมารวมกัน

 

ดังนั้นค่าความต่างของวันที่ได้ (ตัวแปร tmp.date.dif) จึงเป็นความแตกต่างของจำนวนวันของวันที่ที่เป็นปี ค.ศ. ทั้งคู่ โดยเป็นปี ค.ศ. ที่เทียบ (ลบด้วย ๕๔๓ แล้ว) จากปี พ.ศ. มาแล้ว ดังนั้นข้อมูลปีของตัวแปร tmp.date2 และข้อมูลในตัวแปร tmp.date3 (ซึ่งมีข้อมูลปี เป็นปีเดียวกัน) นั้น เป็นข้อมูลปีที่ต้องตรวจสอบว่าปีไหนเป็นปีอธิกสุรทิน ปีไหนเป็นปีปกติสุรทิน ไม่ใช่ตรวจสอบข้อมูลต้นฉบับ (ข้อมูลตัวแปร tmp.y)

 

ดังนั้นเราต้องมาตรวจสอบดูว่าข้อมูลปี ค.ศ. ไหนบ้างที่เป็นปีอธิกสุรทินและปีไหนเป็นปีปกติสุรทิน

 

แนวคิดในการตรวจสอบก็เหมือนก่อนหน้านี้โดยการดึงค่าปีจากข้อมูลในตัวแปร tm.date2 หรือ tmp.date3 ตัวแปรหนึ่งตัวแปรใดก็ได้ เพราะเป็นข้อมูลปีเดียวกัน

 

หลังจากได้ค่าปีจากตัวแปร tmp.date2 หรือจากตัวแปร tmp.date3 แล้วนำค่าปีที่ได้ (ต้องเปลี่ยนให้เป็น numeric vector ก่อน) นำไปใส่ฟังก์ชัน modulus (%%) ด้วย ๔ ๑๐๐ และ ๔๐๐ เพื่อตรวจสอบผลลัพธ์ที่ได้ว่าเป็น ๐ (ศูนย์) หรือไม่ หากผลลัพธ์ที่ได้เป็นศูนย์แสดงว่าหารด้วย ๔ หรือ ๑๐๐ หรือ ๔๐๐ ลงตัว

 

ให้ตัวแปรที่จะสร้างขึ้นใหม่ที่ใช้เก็บค่า modulus ของ ๔, ๑๐๐ และ ๔๐๐ คือตัวแปร tmp.y.4.2 และตัวแปร tmp.y.100.2 และ tmp.y.400.2 ตามลำดับและในตัวอย่างนี้เราจะใช้ข้อมูลปีจากตัวแปร tmp.date2

> test.date$tmp.y.4.2 <- as.numeric(format(test.date$tmp.date2,"%Y"))%%4
> test.date$tmp.y.100.2 <- as.numeric(format(test.date$tmp.date2,"%Y"))%%100
> test.date$tmp.y.400.2 <- as.numeric(format(test.date$tmp.date2,"%Y"))%%400
> test.date[,c(5:9,13:14)]
     tmp.date2  tmp.date3 tmp.date.dif tmp.y.4 tmp.y.100 tmp.y.4.2 tmp.y.100.2
1   1964-01-10 1964-01-14   -3.75 days       3         7         0          64
2   1965-12-16 1965-12-20   -3.75 days       0         8         1          65
3   1966-11-20 1966-11-24   -3.75 days       1         9         2          66
4   1967-02-03 1967-02-07   -3.75 days       2        10         3          67
5   1968-05-31 1968-06-05   -4.75 days       3        11         0          68
6   1969-02-08 1969-02-13   -4.75 days       0        12         1          69
7   1970-03-21 1970-03-25   -3.75 days       1        13         2          70
8   1971-02-03 1971-02-07   -3.75 days       2        14         3          71
9   1972-01-12 1972-01-16   -3.75 days       3        15         0          72
10  1973-06-29 1973-07-03   -3.75 days       0        16         1          73

.....

 

ลองเปรียบเทียบข้อมูลในตัวแปร tmp.y.4 tmp.y.100 กับข้อมูลในตัวแปร tmp.y.4.2 และ tmp.y.100.2 ดูนะครับ

 

เราจะเห็นว่า ข้อมูลที่อยู่ในตัวแปรทั้ง ๔ ข้างต้นไม่ตรงกันแล้ว หรือเราจะพบว่าปี ค.ศ. ๑๙๖๔ เป็นปีอธิกสุรทิน เพราะหารด้วย ๔ ลงตัว (เหลือเศษ ๐) และหารด้วย ๑๐๐ ไม่ลงตัว (เศษ ๖๔)

 

และจากข้อมูลจะพบว่าปี ค.ศ. ๒๐๐๐ นั้นจะจะหารด้วย ๔ ๑๐๐ และ ๔๐๐ ลงตัว ดังนั้นปี ค.ศ. ๒๐๐๐ จะเป็นปีอธิกสุรทิน (แม้จะหารด้วย ๑๐๐ ลงตัวแต่ก็หารด้วย ๔๐๐ ลงตัว จึงเป็นวันอธิกสุรทิน)

 

ดังนั้นค่าความต่างของปีในตัวแปร tmp.date.dif จะต้องเป็น (เริ่มจากปี ค.ศ. ๑๙๖๔) ๓.๗๕ จากนั้นปี ๑๙๖๕ - ๑๙๖๗ เป็นปีปกติสุรทินค่าความต่างต้องเป็น ๔.๗๕ และเป็น ๓.๗๕ อีกครั้งเมื่อถึงปี ๑๙๖๘ และปี ๑๙๖๙ - ๑๙๗๑ ค่าความต่างต้องเป็น ๔.๗๕ และเปลี่ยนเป็น ๓.๗๕ อีกครั้งเมื่อเป็นปี ค.ศ. ๑๙๗๒ อย่างนี้เป็นต้น แต่ถ้าปีใดที่หารด้วย ๔ และ ๑๐๐ ลงตัวแต่หารด้วย ๔๐๐ ไม่ลงตัว ปีนั้นก็จะเป็นปีปกติสุรทินค่าความต่างต้องเป็น ๔.๗๕

 

ในข้อมูลตัวอย่างนี้ไม่มีปีที่มีเงื่อนไขดังข้างต้น (มีข้อมูลตัวอย่างแค่ ๑๐๑ ปีเท่านั้น)

 

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

> test.date$tmp.date2[(test.date$tmp.y.4.2 ==0 & test.date$tmp.y.100.2!=0) | (test.date$tmp.y.4.2 ==0 & test.date$tmp.y.100.2==0 & test.date$tmp.y.400.2 ==0)]
 [1] "1964-01-10" "1968-05-31" "1972-01-12" "1976-06-12" "1980-12-13" "1984-05-20" "1988-07-02" "1992-09-01" "1996-04-17" "2000-02-15" "2004-09-09" "2008-02-01"
[13] "2012-09-03" "2016-08-06" "2020-07-29" "2024-10-05" "2028-11-26" "2032-06-11" "2036-02-11" "2040-10-09" "2044-12-20" "2048-07-31" "2052-01-08" "2056-07-09"
[25] "2060-02-08" "2064-11-05"

 

ดูข้อมูลอื่นประกอบด้วยนอกเหนือจากข้อมูลวันที่

 

งานนี้ต้องใช้ฟังก์ชัน which() มาช่วยครับ

 

> test.date[which((test.date$tmp.y.4.2 ==0 & test.date$tmp.y.100.2!=0) | (test.date$tmp.y.4.2 ==0 & test.date$tmp.y.100.2==0 & test.date$tmp.y.400.2 ==0)),c(6:7,13:15)]
     tmp.date3 tmp.date.dif tmp.y.4.2 tmp.y.100.2 tmp.y.400.2
1   1964-01-14   -3.75 days         0          64         364
5   1968-06-05   -4.75 days         0          68         368
9   1972-01-16   -3.75 days         0          72         372
13  1976-06-17   -4.75 days         0          76         376
17  1980-12-18   -4.75 days         0          80         380
21  1984-05-25   -4.75 days         0          84         384
25  1988-07-07   -4.75 days         0          88         388
29  1992-09-06   -4.75 days         0          92         392
33  1996-04-22   -4.75 days         0          96         396
37  2000-02-19   -3.75 days         0           0           0
41  2004-09-14   -4.75 days         0           4           4
45  2008-02-05   -3.75 days         0           8           8
49  2012-09-08   -4.75 days         0          12          12
53  2016-08-11   -4.75 days         0          16          16
57  2020-08-03   -4.75 days         0          20          20
61  2024-10-10   -4.75 days         0          24          24
65  2028-12-01   -4.75 days         0          28          28
69  2032-06-16   -4.75 days         0          32          32
73  2036-02-15   -3.75 days         0          36          36
77  2040-10-14   -4.75 days         0          40          40
81  2044-12-25   -4.75 days         0          44          44
85  2048-08-05   -4.75 days         0          48          48
89  2052-01-12   -3.75 days         0          52          52
93  2056-07-14   -4.75 days         0          56          56
97  2060-02-13   -4.75 days         0          60          60
101 2064-11-11   -5.75 days         0          64          64

 

,c(6:7,13:15)] เลือกเฉพาะสดมภ์ (ตัวแปรที่ต้องการเท่านั้นมาแสดง หรือคือตัวแปรที่ 6, 7, 13, 14 และ15 เท่านั้น

 

ตรวจสอบว่าปีที่เป็นปีอธิกสุรทินมีจำนวนกี่ปี จากข้อมูลตัวอย่าง โดยใช้ฟังก์ชัน nrow()

> nrow(test.date[which((test.date$tmp.y.4.2 ==0 & test.date$tmp.y.100.2!=0) | (test.date$tmp.y.4.2 ==0 & test.date$tmp.y.100.2==0 & test.date$tmp.y.400.2 ==0)),c(6:7,13:15)])
[1] 26

 

จำนวนปีที่เป็นปีอธิกสุรทินมีจำนวน ๒๖ ปีในรอบ ๑๐๑ ปีของข้อมูลตัวอย่าง หรือคิดง่าย ๆ ว่า ๔ ปีมี ๑ ครั้ง ถ้า ๑๐๐ ปีก็คือ ๑๐๐ / ๔ = ๒๕ ปี

 

ดังนั้นในรอบ ๑๐๑ ปี ปีที่เป็นปีอธิกสุรทินต้องมี ๒๕ ปี บวก/ ลบ แล้วแต่ช่วงปีของข้อมูลจะอยู่ในช่วงไหน

 

นับจำนวนปีที่มีค่าความต่างเท่ากับ ๕ วันหรือเท่ากับ -๔.๗๕

 

ก่อนอื่นเพื่อความสะดวกเก็บข้อมูลปีอธิกสุรทินไว้ในกรอบข้อมูล test02 โดยใช้บรรทัดคำสั่ง

> test02 <- test.date[which((test.date$tmp.y.4.2 ==0 & test.date$tmp.y.100.2!=0) | (test.date$tmp.y.4.2 ==0 & test.date$tmp.y.100.2==0 & test.date$tmp.y.400.2 ==0)),c(6:7,13:15)]

 

นับจำนวนปีที่มีค่าจำนวนวันที่ต่างที่ไม่น่าจะถูกต้อง

 

> length(test02$tmp.date.dif[test02$tmp.date.dif==-4.75])
[1] 19

 

พบว่ามีจำนวนปีที่ค่าความต่างของวันมีค่าผิดไปจากที่ควรจะเป็นถึง ๑๙ ปี จาก ๒๖ ปี

 

ที่ถูกต้องมีเพียง ๖ ปีเท่านั้น และมี ๑ ปีคือปี ๒๐๖๔ ค่าความต่างยังผิดไปจากปีอื่น ๆ มากคือค่าความต่างเป็น ๖ วัน

 

สิ่งที่เราต้องทราบก็น่าจะต้องเป็นรูปแบบ (patterns) ของข้อมูลค่าความต่างของวันว่ามีรูปแบบใด ทำไมถึงไม่เป็นอย่างที่ตั้งสมมติฐานเอาไว้ ค่าที่เราใช้ลบออกจากวันที่นั้นเป็นค่าคงที่คือ ๕๔๓ x ๓๖๕.๒๕ ดังนั้นสิ่งที่จะทำให้ค่าความต่างของวันเปลี่ยนแปลงไปก็คงต้องเป็นข้อมูลวันที่

 

มีอะไรในข้อมูลวันที่ที่นอกเหนือจากการเก็บเป็นจำนวนวันจากวันเริ่มต้น (Origin date) ของข้อมูลที่มี class เป็น  Date อีกบ้าง

 

การเปลี่ยนแปลง เพิ่มขึ้น หรือลดลงของจำนวนวันในแต่ละปีของข้อมูลที่มี class เป็น  Date นั้นมีการเปลี่ยนแปลงอย่างไร เพิ่ม ลด อย่างคงที่หรือไม่ ซึ่งตามทฤษฎีแล้วการเปลี่ยนแปลงนี้น่าจะคงที่

 

ข้อมูลที่ใช้เป็นตัวอย่าง (จำนวน ๑๐๑ ปี และแต่ละปีใช้จำนวนวันเป็นตัวแทนเพียง ๑ วัน) มีจำนวนเพียงพอต่อการตรวจสอบสมมติฐานหรือไม่

 

จะต้องเพิ่มจำนวนปี หรือจำนวนวันให้มากขึ้นเพื่อที่จะให้สามารถตรวจสอบรูปแบบของค่าความต่างของวันหรือไม่?

 

สิ่งเหล่านี้เป็นคำถาม เป็นสมมติฐานที่ต้องค้นหาคำตอบกันต่อไป

 

อิอิอิ

 

เราเอง

 

เพลง:
ศิลปิน:

หมวดหมู่บันทึก: เรื่องทั่วไป
สัญญาอนุญาต: ซีซี: แสดงที่มา-ไม่ใช้เพื่อการค้า-อนุญาตแบบเดียวกัน Cc-by-nc-sa
สร้าง: 19 เมษายน 2557 02:07 แก้ไข: 01 พฤษภาคม 2563 09:34 [ แจ้งไม่เหมาะสม ]
ดอกไม้
สมาชิกที่ให้กำลังใจ: Ico24 ServiceMan, Ico24 คนธรรมดา, และ 2 คนอื่น.
สมาชิกที่ให้กำลังใจ
 
Facebook
Twitter
Google

บันทึกอื่นๆ

ความเห็น

ตีสองแล้ว น้าฯ ยังดั้นด้นไปในวันที่สับสนกับเครื่องมือของน้าอยู่

 

ฮิฮิ

 

"ใจสั่งมา"

Ico48
Our Shangri-La (Recent Activities)
19 April 2014 15:26
#97663

ที่จริงแล้วเขียนไว้ก่อนจะเลยเที่ยงคืนแล้ว แต่เพิ่งมีโอกาสได้มาปิดเรื่องและบันทึก

อิอิอิ

เราเอง

คุณต้องทำการเข้าระบบก่อนแสดงความเห็น