Funkcje daty w Tableau – wprowadzenie

Sebastian Wareluk

sty 29, 2021

Tableau

banery data science

W poprzednim wpisie związanym z datami omawialiśmy funkcję DATEPARSE, która może posłużyć do skonwertowania danych tekstowych przechowujących datę w formacie, który nie został przez Tableau automatycznie rozpoznany. Kiedy już dane, które mają funkcjonować jako data są odpowiednio interpretowane możemy ich użyć do tworzenia różnego rodzaju kalkulacji z użyciem rozmaitych funkcji przyjmujących jako argumenty właśnie datę.

Zanim jednak w naszej serii zagłębimy się w budowanie bardziej złożonych kalkulacji przyjrzyjmy się grupie kilku funkcji, które modyfikują datę lub pozwalają na wyciągnięcie z niej pewnych elementów. Kluczem do zrozumienia kiedy z danych funkcji korzystać oraz jak ich używać zestawiając je ze sobą będzie utrwalenie sobie wiedzy o tym, jakiego rodzaju danymi są elementy, które poszczególne funkcje zwracają.

Muszę przyznać, że długo zastanawiałem się jaki zakres funkcji objąć tym wpisem, ponieważ z jednej strony założeniem tworzenia encyklopedii kalkulacji było to, żeby jeden wpis był poświęcony jednej funkcji. Z drugiej zaś strony, z mojego doświadczenia oraz praktyki związanej z prowadzeniem szkoleń wynika, że część z nich zdecydowanie łatwiej przyswoić, kiedy na ich rolę patrzymy jak na element większej całości. Dlatego choć koncepcja na rozwój tego wpisu podpowiada, żeby rozwinąć go w bardzo dużym stopniu, tym razem posłucham głosu rozsądku, skupię się na podstawach i kilku najważniejszych funkcjach oraz potraktuję ten wpis jako tekst do którego będę odsyłał z bardziej szczegółowych artykułów, w których nie będę się skupiał na omawianiu podstaw.

A zatem, dzisiaj na tapet weźmiemy funkcje DATENAME, DATEPART, DATETRUNC oraz zestaw funkcji, których nazwy wskazują bezpośrednio na element daty, czyli YEAR, QUARTER, DAY itd.

Poniżej opiszę pokrótce każdą z tych funkcji, a na koniec skupimy się na konkluzji będącej dla nas kluczowym wnioskiem do zrozumienia w jaki sposób sprawnie żonglować tymi funkcjami budując nasze kalkulacje.

DATENAME – imię daty

Zacznijmy więc alfabetycznie. Na początek, Tableau i funkcja DATENAME. Jak sugeruje nazwa, jest to funkcja, która zwróci ‘imię’ daty. Skąd takie łopatologiczne porównanie? Żebyśmy pamiętali, że dane które będą wynikiem wykonania tej funkcji będą tekstem. Składnia? Bajecznie prosta!

Pamiętaj, że w kreatorze kalkulacji po prawej stronie dostępny jest krótki opis tego, jak działa dana funkcja. Z kolei po dodaniu jej do okienka kalkulacji w etykiecie pod funkcją będziesz widział informację jakich argumentów oczekuje funkcja. W tym przypadku obowiązkowymi dwoma elementami które musimy uzupełnić są:

  •  date_part – poprzez date_part jako argument funkcji Tableau rozumie określenie na jakim elemencie daty chcesz operować. Może to być np. ‘year’, ‘quarter’, ‘day’ itd. Pełną listę znajdziesz w dokumentacji pod tym linkiem: https://help.tableau.com/current/pro/desktop/en-us/data_dateparse.htm Pamiętaj, że te elementy muszą być pisane małymi literami i ujęte w cudzysłów lub średniki.
  • date – drugi argument. Date, czyli wskazanie na jakiej dacie Tableau ma wykonać żądana operację. Może to być zarówno data wpisana na stałe w kalkulację, wtedy taką datę należy osadzić między dwoma znakami #, np. #05.01.1987#. Może to być również kolumna, która przechowuje dane w formacie daty, czyli zdecydowana większość przypadków. W takiej sytuacji funkcja prezentuje się następująco:

Co się stanie jeśli funkcją DATENAME zapytamy o element daty który jest liczbą? Na przykład:

DATENAME(‘year’, #04.01.1999#)

Wynikiem tej funkcji będzie 1999, ale Tableau poda tę wartość w postaci tekstu. Jeśli będziesz chciał wykorzystać 1999 jako liczbę będziesz musiał ją najpierw skonwertować do formatu liczbowego, np. Integer w taki sposób:

INT(DATENAME(‘year’, #04.01.1999#))

lub zamiast DATENAME posłużyć się funkcją DATEPART, o której przeczytasz w kolejnym akapicie.

DATEPART – część daty

Drugą funkcją Tableau, którą omówimy będzie DATEPART. Jest to funkcja, którą możemy również trafnie skojarzyć po nazwie – zwraca ‘część’ daty. Jeśli spojrzymy na przykładową datę, 01.06.2021 to widzimy, że część daty jest jakąś liczbą. I tak to możemy zapamiętać – DATEPART zadziała bardzo podobnie jak DATENAME, ale jej wynikiem będą dane w formacie liczbowym, a konkretnie w formacie Integer. Składnia funkcji DATEPART jest identyczna jak w przykładzie powyżej, z tym że oczywiście musimy zmienić nazwę samej funkcji:

DATEPART(date_part, date)

Czyli na przykład:

DATEPART(‘month’, [Order Date])

Zatrzymam się jeszcze na chwilę przy tej funkcji, żeby zwrócić Twoją uwagę na jeden drobny szczegół. Mianowicie w Tableau funkcjonują dwie rzeczy o podobnej nazwie, którą szczególnie w komunikacji głosowej będziemy słyszeli tak samo, czyli datepart. Jaka jest różnica między DATEPART, a date_part w Tableau? Otóż jak już z pewnością zdążyłeś się zorientować, pierwszy element to funkcja kalkulacji, a drugi to argument dla różnych funkcji określający element daty.

DATETRUNC – jak “sprowadzić” datę wybranego okresu do jego pierwszego dnia?

Trzecim elementem omawianego zestawu będzie funkcja DATETRUNC w Tableau. Jest to funkcja, która oczekuje takiego samego zestawu argumentów jak dwie powyższe, ale dane będące efektem jej działania podane są w formacie daty, a konkretnie Datetime.

Czy możemy posłużyć się analogicznym przykładem jak powyżej, żeby metodą skojarzeń zapamiętać co właściwie DATETRUNC robi? Oczywiście. Kiedyś na jednym ze szkoleń posłużyłem się dość obrazowym porównaniem mówiąc, że ta funkcja ‘przycina’ daty z okresu określonego pierwszym argumentem funkcji, do pierwszego dnia tego okresu. I choć samo słowo ‘przycina’ nie jest stuprocentowo trafne, bo bardziej celną definicją byłoby powiedzenie że ‘sprowadza’ daty z wybranego okresu do jego pierwszego dnia, to uczestnicy, a właściwie uczestniczki uznały, że to tłumaczenie dało im właściwy obraz działania DATETRUNC.

No dobrze, ale dosyć teorii. Jak to wygląda w praktyce?

Załóżmy, że nasz DATETRUNC wygląda tak:

DATETRUNC(‘month’, [Data])

I działa na poziomie każdego rekordu znajdziesz w tabeli na daty, które w niej występują.

Wynikiem działania funkcji będzie data pierwszego dnia okresu, określonego przy pomocy date_part w funkcji DATETRUNC. Jest to bardzo ważna funkcja, ponieważ Tableau w ten sposób agreguje daty do określonych poziomów np. miesięcy czy kwartałów.

O bardzo szerokim zastosowaniu tej funkcji będziemy jeszcze niejednokrotnie wspominać na naszym blogu, m. in. w artykule, który będzie poświęcony tylko jej zastosowaniu.

Zbiór funkcji YEAR(), QUARTER(), MONTH(), WEEK () i DAY()

Ostatnim punktem będzie zbiór funkcji YEAR(), QUARTER(), MONTH(), WEEK () i DAY()

Są to funkcje, które będą przyjmować tylko jeden argument w postaci daty. W odpowiedzi uzyskamy dane w formacie liczbowym Integer. I tak na przykład:

MONTH(#04.05.2020#) = 5

YEAR(#04.05.2020#) = 2020

Wnioski końcowe, czyli co warto zapamiętać

To, jakie argumenty przyjmują poszczególne funkcje jest rzeczą, która zawsze nam się rzuci w oczy w okienku kalkulacji i nie musimy obudzeni w środku nocy pamiętać struktury każdej funkcji. Rzeczą która jest zdecydowanie bardziej istotna dla myślenia koncepcyjnego o logice, którą chcemy zbudować jest to, jaki format danych jest wynikiem działania poszczególnych funkcji.

Rozbudowując w Tableau tabelę, którą zacząłem tworzyć przy pierwszym przykładzie, dodawałem do niej kalkulacje bazujące na kolejnych omawianych funkcjach. I choć szczególnie w przypadku DATENAME, DATEPART i DATETRUNC argumenty funkcji były takie same, to ich wyniki są zupełnie inne:

Zwróć też uwagę na ikonki symbolizujące typy danych przy pigułkach w folderze Kalkulacje w panelu danych. W skrócie, cały powyższy tekst możemy ująć w poniższej tabeli:

Po co nam ta wiedza? Żeby nie popełniać najczęstszych błędów lub żeby szybko dostrzec co jest nie tak, jeśli z rozpędu napiszemy coś podobnego do poniższego przykładu:

DATENAME(‘day’, [Order Date])= DATEPART(‘day’, [Ship Date])

Zakładając że:

Order Date = 05.01.2021

Ship Date = 06.01.2021

Operując na samych datach Tableau rozumiałby taki zapis jako:

5=6

Co w jego rozumienie będzie fałszem. Pole z taką kalkulacją powinno prezentować typ danych Boolean i zwrócić wartość FALSE. Jednak w rzeczywistości sama kalkulacja będzie błędna, ponieważ porównując ze sobą powyższe funkcje porównujemy tekst z liczbą. Poprawnie, mając świadomość na jakich typach danych operujemy, możemy powyższą kalkulacje zapisać następująco:

DATEPART(‘day’, [Order Date])= DATEPART(‘day’, [Ship Date]) – porównujemy liczbę z liczbą

lub

DATENAME(‘day’, [Order Date])= DATENAME(‘day’, [Ship Date]) – porównujemy tekst z tekstem

lub

INT(DATENAME(‘day’, [Order Date]))= DATEPART(‘day’, [Ship Date]) – porównujemy liczbę z liczbą

lub

DATENAME(‘day’, [Order Date])= STR(DATEPART(‘day’, [Ship Date])) – porównujemy tekst z tekstem

Drugim bardziej użytecznym zastosowaniem tej wiedzy jest to, że kiedy patrzymy w okienku kalkulacji na różne funkcje oraz argumenty których potrzebują, możemy się szybko zorientować, jak przygotować sobie pewne elementy naszych danych, żeby odpowiednio zasilić nimi kolejną funkcję. Chcąc stworzyć kalkulację, w której będziemy dokonywać obliczeń w oparciu o elementy daty wykorzystamy funkcję DATEPART, a chcąc osadzić element daty w jakimś tekście, np. opisie czy tytule, wydobędziemy go przy pomocy DATENAME – wtedy z powodzeniem podda się konkatenacji i pozwoli się połączyć z pozostałą częścią tekstu.