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:
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
monthsparayears.Exemplo:
df["Date2"] = df["Date"] + pd.DateOffset(years=1)
Dica 3: As possibilidades de
DateOffsetsã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.
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