Dicas de Python

Manipulação de data e tempo

Site oficial do DateOffset:

  • Sobre DataOffet:

https://pandas.pydata.org/docs/reference/api/pandas.tseries.offsets.DateOffset.html

  • Sobre Timedelta:

https://pandas.pydata.org/docs/reference/api/pandas.Timedelta.html

As dicas abaixo são do link:

https://towardsdatascience.com/5-examples-to-learn-date-and-time-manipulation-with-python-pandas-9ab9cdeb032e

Dica 1: Para decrementar ou diminuir, basta adicionar o sinal de menos (-).

Exemplo: months=-6.

Dica 2: Para incrementar em anos, basta alterar o nome months para years.

Exemplo:

df["Date2"] = df["Date"] + pd.DateOffset(years=1)

Dica 3: As possibilidades de DateOffset são: years, month, week, day, hour, minute, second, microsecon e nanosecond.

Manipulação de data e hora com DateOffset

The DateOffset function can be used for adding a specific length of duration to dates.

A função DataOffset pode ser utilizada para adicionar um comprimento temporal específico ao conjunto de datas.

import pandas as pd

df = pd.DataFrame({
    "Date": pd.date_range(start="2021-12-28", periods=5, freq="D"),
    "Measurement": [1, 10, 25, 7, 12]
})

print(df)

O código inicia com a data em 2021-12-28, serão criados 5 tempos (period) ou dias de acordo com freq.

Ao executar o código acima, o resultado será:

        Date  Measurement
0 2021-12-28            1
1 2021-12-29           10
2 2021-12-30           25
3 2021-12-31            7
4 2022-01-01           12

Criação de uma nova coluna no DataFrame adicionando 6 meses a coluna já existente de datas.

Neste exemplo, será criada uma nova coluna chamada ´Date2´.

df["Date2"] = df["Date"] + pd.DateOffset(months=6)

print(df)

O resultado será:

        Date  Measurement      Date2
0 2021-12-28            1 2022-06-28
1 2021-12-29           10 2022-06-29
2 2021-12-30           25 2022-06-30
3 2021-12-31            7 2022-06-30
4 2022-01-01           12 2022-07-01

Note que houve um incremento de 6 meses na variável Date.

Adicionando incremento

Os valores que estão sendo trabalhados na coluna Date são do tipo datetime, portanto é possível adicionar incrementos ou intervalos.

df["Date2"] = df["Date"] + pd.DateOffset(hours=2)`

print(df)

Neste caso, foi adicionado o intervalo a cada 2 horas.

Manipulação do Datetime utilizando Timedelta

O Timedelta é útil para somar datas e tempos. A sua declaração é um pouco diferente da função DateOffset.

O parâmetro unit pode receber os seguintes valores:

  • W’, ‘D’, ‘T’, ‘S’, ‘L’, ‘U’, ou ‘N’

  • days’ ou ‘day’

  • hours’, ‘hour’, ‘hr’, ou ‘h’

  • minutes’, ‘minute’, ‘min’, ou ‘m’

  • seconds’, ‘second’, ou ‘sec’

  • milliseconds’, ‘millisecond’, ‘millis’, ou ‘milli’

  • microseconds’, ‘microsecond’, ‘micros’, ou ‘micro’

  • nanoseconds’, ‘nanosecond’, ‘nanos’, ‘nano’, ou ‘ns’.

df["Date2"] = df["Date"] + pd.Timedelta(3, unit="day")

print(df)

O resultado será:

        Date  Measurement      Date2
0 2021-12-28            1 2021-12-31
1 2021-12-29           10 2022-01-01
2 2021-12-30           25 2022-01-02
3 2021-12-31            7 2022-01-03
4 2022-01-01           12 2022-01-04

Neste exemplo, os dias são incrementados a cada três dias, por isso, o valor 3 e a unidade (unit) está em dias (day).

O Timedelta aceita strings como argumento ("3 days"). Exemplo:

df["Date2"] = df["Date"] + pd.Timedelta("3 days")

print(df)

Extraindo informação do objeto datetime

O objeto datetime possui vários pedaços de informações que podem ser utilizadas, por exemplo: year, month, day, week, hour, microsecond, detre outras possibilidades.

Para ver as informações, basta digitar:

print(dir(df["Date"].dt))

Algumas possibilidades:

  • ‘day’

  • ‘day_name’

  • ‘day_of_week’

  • ‘day_of_year’

  • ‘dayofweek’

  • ‘dayofyear’

  • ‘days_in_month’

  • ‘daysinmonth’

  • ‘freq’

  • ‘hour’

  • ‘is_leap_year’

  • ‘is_month_end’

  • ‘is_month_start’

  • ‘is_quarter_end’

  • ‘is_quarter_start’

  • ‘is_year_end’

  • ‘is_year_start’

  • ‘minute’

  • ‘month’

  • ‘month_name’

  • ‘normalize’

  • ‘quarter’

  • ‘round’

  • ‘second’

  • ‘time’

  • ‘timetz’

  • ‘to_period’

  • ‘to_pydatetime’

  • ‘week’

  • ‘weekday’

  • ‘weekofyear’

  • ‘year’

Exemplo 1: Ao digitar o comando abaixo:

print(df["Date"].dt.month)

O resultado será:

0    12
1    12
2    12
3    12
4     1
Name: Date, dtype: int64

Função isocalendar

Retorna de uma vez as informações de year, week e day.

Exemplo:

print(df["Date"].dt.isocalendar())

O resultado será:

   year  week  day
0  2021    52    2
1  2021    52    3
2  2021    52    4
3  2021    52    5
4  2021    52    6

Diferença entre datas

Neste exemplo, será mostrado como calcular a diferença entre duas datas. Essa tarefa pode ser feita por meio do datetime.

# Cria uma nova coluna chamada Date2.
df["Date2"] = df["Date"] + pd.DateOffset(months=6)

# Cria uma nova coluna que armazenará a diferença entre as duas datas, "Date2" e "Date".
df["diff"] = df["Date2"] - df["Date"]

print(df)

O resultado será:

        Date  Measurement      Date2     diff
0 2021-12-28            1 2022-06-28 182 days
1 2021-12-29           10 2022-06-29 182 days
2 2021-12-30           25 2022-06-30 182 days
3 2021-12-31            7 2022-06-30 181 days
4 2022-01-01           12 2022-07-01 181 days

A coluna diff é do tipo timedelta, dessa forma é possível extrair o número de dias usando o método day.

print(df["diff"].dt.days)

O resultado do comando acima será:

0    182
1    182
2    182
3    181
4    181
Name: diff, dtype: int64

E como saber o resultado em meses?

Para converter a diferença em meses ou anos, utiliza-se o timedelta do NumPy porque o Pandas não pode construir um Timedelta de meses ou anos.

import numpy as np

numero_meses = df["diff"] / np.timedelta64(1, 'M')

print(numero_meses)

O resultado será:

0    5.979589
1    5.979589
2    5.979589
3    5.946734
4    5.946734
Name: diff, dtype: float64

Visualizando gráficos no Jupyter Notebook

Caso esteja trabalhando com o Jupyter Notebook, para visualizar as figuras, basta adicionar a linha abaixo logo após a importação das suas bibliotecas.

%matplotlib inline

Exemplo:

import pandas as pd
import xarray as xr
import matplotlib.pylab as plt
import numpy as np
%matplotlib inline

Agrupamento de séries temporais

Estava trabalhando com duas séries temporais no formato NetCDF em arquivos separados, isto é, var(time, lat, lon). Eu precisava juntar as duas variáveis em um DataFrame. Eu usei a dica abaixo que me ajudou.

https://numpy.org/doc/stable/reference/generated/numpy.column_stack.html

Manipulação da dimensão tempo

Trabalhar com a dimensão tempo às vezes nos proporciona muitas horas de pesquisa e dor de cabeça. Abaixo, separeia alguns links úteis para trabalhar com essa dimensão.

https://www.dataquest.io/blog/python-datetime-tutorial https://stackoverflow.com/questions/57703538/typeerror-only-valid-with-datetimeindex-timedeltaindex-or-periodindex-but-got https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.resample.html

Resetar index do DataFrame

Às vezes, você tem interesse em que uma coluna que está definida como index seja convertida para coluna para fins de manipulação. O link aabaixo faz isso de forma simples e fácil.

https://datagy.io/pandas-drop-index-column/

Geração gráfica de um Histograma

https://chartio.com/learn/charts/histogram-complete-guide/ https://www150.statcan.gc.ca/n1/edu/power-pouvoir/ch9/histo/5214822-eng.htm https://datatofish.com/plot-histogram-python/

Erro no Jupyter Notebook

Dica disponível em: [https://github.com/PayneLab/cptac/issues/3](Solução: https://github.com/PayneLab/cptac/issues/3)

Caso apareça o erro abaixo:

ModuleNotFoundError: No module named 'packaging'

Basta fazer:

pip3 install packaging

ou

conda install packaging