ISO 8601 στο Excel

Για το έτος και την καταμέτρηση των εβδομάδων του με βάση το πρότυπο ISO 8601 είπαμε σε προηγούμενο σημείωμα και εκεί δώσαμε 2 συναρτήσεις φύλλου με τις οποίες γίνεται υπολογισμός της εβδομάδας στην οποία ανήκει μία ημερομηνία.
Κατά το πρότυπο ISO 8601 (για τη χώρα μας ΕΛΟΤ ΕΝ 28601):
1) Η εβδομάδα αρχίζει πάντα Δευτέρα και τελειώνει Κυριακή.
2) Η πρώτη εβδομάδα του έτους είναι η εβδομάδα που περιέχει την πρώτη Πέμπτη του έτους.
3) Αν στην εβδομάδα αυτή υπάρχουν και ημέρες του προηγουμένου χρόνου, τότε αυτές θεωρούνται ημέρες της πρώτης αυτής εβδομάδος.
4) Οι ημέρες του έτους που τυχόν προηγούνται της Δευτέρας της πρώτης εβδομάδας, θεωρούνται ότι ανήκουν στην τελευταία εβδομάδα του προηγουμένου χρόνου.

Στο διάγραμμα με πράσινο χρώμα είναι όλες οι περιπτώσεις για την 1η εβδομάδα, η οποία όπως βλέπετε, το νωρίτερo που μπορεί να ξεκινήσει είναι 29 Δεκεμβρίου και πιο αργά 4 Ιανουαρίου. Παρατηρήστε ότι η 4η Ιανουαρίου ανήκει πάντα στην πρώτη εβδομάδα και αυτή είναι μία βασική παρατήρηση για την κατασκευή των τύπων που θα περιγράψουμε παρακάτω. Δηλαδή το ISO έτος ξεκινά την Δευτέρα που προηγείται της 4ης Ιανουαρίου, εκτός αν η 4η Ιαν είναι Δευτέρα και τότε ξεκινά 4 Ιαν.
Όμοια, η 28η Δεκεμβρίου υπάρχει πάντα στην τελευταία εβδομάδα του ISO έτους (κίτρινο χρώμα στο διάγραμμα) και το έτος τελειώνει την Κυριακή που έπεται της 28ης Δεκεμβρίου, εκτός αν η 28 Δεκ είναι Κυριακή και τότε αυτή είναι η τελευταία ημέρα του έτους.
Ας δούμε όμως τις συναρτήσεις, τις οποίες μπορείτε να βρείτε και στο excel βιβλίο: ISO8601functions όπού μπορείτε να δείτε και τα σταδιακά βήματα με τα οποία φτάσαμε σε μερικές από αυτές.

Α) Δίνεται μια ημερομηνία (κελί Α1) να βρεθεί η ISO εβδομάδα στην οποία ανήκει.
Χρησιμοποιήστε μία από τις παρακάτω συναρτήσεις (είναι ισοδύναμες) σε ένα κελί μορφοποιημένο σε αριθμό.

=INT(A1/7-(DATE(YEAR(A1+4-WEEKDAY(A1;2));1;4)-WEEKDAY(DATE(YEAR(A1+4-WEEKDAY(A1;2));1;4);3))/7)+1
=INT(A1/7-(DATE(YEAR(A1+3-WEEKDAY(A1;3));1;4)-WEEKDAY(DATE(YEAR(A1+3-WEEKDAY(A1;3));1;4);3))/7)+1
=(A1-WEEKDAY(A1;2)-DATE(YEAR(A1+4-WEEKDAY(A1;2));1;4)+WEEKDAY(DATE(YEAR(A1+4-WEEKDAY(A1;2));1;4);2))/7+1

Β) Πλήθος εβδομάδων. Ένα ISO έτος έχει 52 ή 53 εβδομάδες. Για να έχει 53 εβδομάδες ένα ISO έτος, πρέπει το κανονικό (Γρηγοριανό) έτος να ξεκινά από Πέμπτη ή να τελειώνει σε Πέμπτη. Δηλαδή αν στο κελί Α1 είναι ένα (τετραψήφιο) έτος, η έκφραση: OR(WEEKDAY(DATE(A1;1;1))=5;WEEKDAY(DATE(A1;12;31))=5) να επιστρέφει 1 (TRUE). Από την παρατήρηση αυτή προκύπτουν οι 2 πρώτοι από τους 4 τύπους που ακολουθούν. Ο 3ος μετρά το πλήθος την ημερών μεταξύ της πρώτης ημέρας (Δευτέρας) του ISO έτους και της πρώτης Δευτέρας του επομένου έτους και διαιρεί δια 7. Παρόμοια και ο επόμενος τύπος δουλεύοντας με τις Πέμπτες.

=52+OR(WEEKDAY(DATE(A1;1;1))=5;WEEKDAY(DATE(A1;12;31))=5)
=IF((OR(WEEKDAY(DATE(A1;1;1))=5;WEEKDAY(DATE(A1;12;31))=5));53;52)
=(DATE(A1+1;1;1)-DATE(A1;1;1)+MOD(5-DATE(A1+1;1;1);7)-MOD(5-DATE(A1;1;1);7))/7
=(DATE(A1+1;1;4)-WEEKDAY(DATE(A1+1;1;4);2)-DATE(A1;1;4)+WEEKDAY(DATE(A1;1;4);2))/7

Γ) Πρώτη Δευτέρα για ένα ISO έτος (Αρχή έτους):

=DATE(A1;1;1)+MOD(5-DATE(A1;1;1);7)-3
=DATE(A1;1;4)-WEEKDAY(DATE(A1;1;4);2)+1
=DATE(A1;1;4)-WEEKDAY(DATE(A1;1;4);3)

Δ) Τελευταία ημέρα (Κυριακή) για ένα ISO έτος:

=DATE(A1+1;1;4-WEEKDAY(DATE(A1+1;1;4);2)+1)-1
=DATE(A1;12;28+7-WEEKDAY(DATE(A1;12;28);2))

Ε) Τελευταία Δευτέρα για ένα ISO έτος (Δευτέρα τελευταίας εβδομάδας):

=DATE(A1;12;28-WEEKDAY(DATE(A1;12;28);3))
=DATE(A1;12;28)+MOD(2-WEEKDAY(DATE(A1;12;28));-7)

ΣΤ) Να βρεθεί η Δευτέρα της εβδομάδας της οποίας γνωρίζω τον αύξοντα αριθμό (Α1) και το έτος (Β1): Παράδειγμα η 45η εβδομάδα του 2010 ξεκινά Δευ, 8 Νοε 2010

=DATE(B1;1;4)-WEEKDAY(DATE(B1;1;4);2)+7*A1-6

Ζ) Μία κοινή ημερομηνία να μετατραπεί σε ISO.
H ISO μορφή μιας ημερομηνίας είναι: YYYY-Www-D.
Όπου YYYY είναι το (τετραψήφιο) ISO έτος, το οποίο δεν ταυτίζεται πάντα με το έτος της κοινής ημερομηνίας, ww είναι ένας διψήφιος αριθμός που δίνει την ISO εβδομάδα και D ένας μονοψήφιος αριθμός από 1 έως 7 για την ημέρα της εβδομάδος
Παραδείγματα.
Δευ, 29 Δεκ 2008 = 2009-W01-1
Κυρ, 3 Ιαν 2010 = 2009-W53-7
Τετ, 25 Δεκ 2002= 2002-W52-3

Αναζητάμε μία συνάρτηση που θα επιστέψει ένα κείμενο που αποτελείται από 3 μέρη: Το τετραψήφιο έτος, τον αριθμό της εβδομάδας και τον αριθμό της ημέρας.
–> Το πρόβλημα του αριθμού της εβδομάδας το έχουμε λύσει, θα χρησιμοποιήσουμε έναν από τους τύπους της (Α) ομάδας. Η συνάρτηση ΤΕΧΤ θα μας βοηθήσει να πάρουμε το αποτέλεσμα στην μορφή –Www-
–> Για τον αριθμό της ημέρας η συνάρτηση WEEKDAY(A1;2) επιστέφει τον αριθμό της ημέρας κατά το πρότυπο. (Δευ =1, Τριτη =2, …. Κυρ=7).
–>Το ISO έτος ταυτίζεται με το έτος της ημερομηνίας, άρα η συνάρτηση YEAR μπορεί να μας το δώσει, εκτός από τις 2 παρακάτω περιπτώσεις:
Ο μήνας είναι Ιανουάριος και ο αριθμός της ISO εβδομάδας 52 ή 53 (βλέπε στο διάγραμμα τις κόκκινες ημέρες στις 3 τελευταίες στήλες), τότε το ISO έτος είναι το προηγούμενο έτος της ημερομηνίας.
Ο μήνας είναι Δεκέμβριος και ο αριθμός της ISO εβδομάδας είναι 1 (βλέπε στο διάγραμμα τις κόκκινες ημέρες στις 3 πρώτες στήλες), τότε το ISO έτος είναι το επόμενο έτος της ημερομηνίας.
Στην πράξη:
Στο κελί Α1 εισάγω την ημερομηνία: Δευ, 29 Δεκ 2008
Στο κελι Β1 με ένα από τους τύπους της ομάδας (Α) παίρνω την εβδομάδα: 1
Στο κελι C1 εισάγω τον τύπο:

=YEAR(A1)-AND(MONTH(A1)=1;B1>51)+AND(MONTH(A1)=12;B1=1)

Η συνάρτηση επιστέφει το έτος της ημερομηνίας του κελιού Α1 και αν αληθεύει η πρώτη λογική συνάρτηση AND αφαιρεί 1, ή αν αληθεύει η δεύτερη AND προσθέτει 1. Εδώ επειδή ο μήνας της ημερομηνίας είναι 12 και η ISO εβδομάδα είναι 1, αληθεύει η δεύτερη AND η οποία επιστρέφει TRUE.
Τελικά η συνάρτηση επιστρέφει 2008-FALSE+TRUE=2008-0+1=2009
Για την ημερομηνία 6/5/2011 θα επέστρεφε 2011-FALSE+FALSE=2011-0+0=2011
Για την 3/1/2010 θα επέστρεφε 2010-ΤRUE+FALSE=2010-1+0=2009
Τέλος στο κελί D1 έχω το τελικό αποτέλεσμα: 2009-W01-1, με την συνάρτηση:

=C1&TEXT(B1;"-W00-")&WEEKDAY(A1;2)

Και αν θέλω έναν απ΄ ευθείας (γίγαντα) τύπο χωρίς τα ενδιάμεσα στάδια:

=(YEAR(A1)-AND(MONTH(A1)=1;(INT(A1/7-(DATE(YEAR(A1+4-WEEKDAY(A1;2));1;4)-WEEKDAY(DATE(YEAR(A1+4-WEEKDAY(A1;2));1;4);3))/7)+1)>51)+AND(MONTH(A1)=12;(INT(A1/7-(DATE(YEAR(A1+4-WEEKDAY(A1;2));1;4)-WEEKDAY(DATE(YEAR(A1+4-WEEKDAY(A1;2));1;4);3))/7)+1)=1))&TEXT((INT(A1/7-(DATE(YEAR(A1+4-WEEKDAY(A1;2));1;4)-WEEKDAY(DATE(YEAR(A1+4-WEEKDAY(A1;2));1;4);3))/7)+1);"-W00-")&WEEKDAY(A1;2)

Η) Μία ISO ημερομηνία να μετατραπεί σε κοινή.(Το αντίστροφο του προηγούμενου προβλήματος)
Η συνάρτηση:

=DATE(LEFT(A1;4);1;4)-WEEKDAY(DATE(LEFT(A1;4);1;4);2)+7*MID(A1;7;2)-7+(RIGHT(A19;1))

για την ημερομηνία: 2009-W01-1 θα επιστρέψει: Δευ, 29 Δεκ 2008.

Όλα τα παραπάνω μπορείτε να δείτε και σε ένα PDF αρχείο : ISO 8601 in Excel (ενημέρωση 22/8/11)

This entry was posted in excel, Συναρτήσεις φύλλου and tagged , , , . Bookmark the permalink.