Wpis z mikrobloga

mam dane godzinowe i chcę je zsumować do pełnych dni.

mam coś takiego:

1 2020-01-02 00:00:00 -13
2 2020-01-02 01:00:00 22
3 2020-01-02 02:00:00 65
4 2020-01-02 03:00:00 -17
5 2020-01-02 04:00:00 -4
6 2020-01-02 05:00:00 5

i chcę uzyskać nowy dataframe, który będzie wyglądał tak:

1 2020-01-02 00:00:00 -58 <--suma wartości godzinowych z tego dnia
danych jest dużo, na kilkanaście lat. jakieś pomysły jak mogę to zrobić?

#python #sql #pandas
  • 8
@maciekXDDD: Możesz sobie to ogarnąć od razu SQL z bazy albo zaciągnąć pełne dane do pandas i zrobić df.groupby([pd.Grouper(key='nazwakolumnyzdata', freq='D')]) albo zrobić df.resample('D') jeśli będziesz miał kolumnę z datą jako index dla swojej dataframe.
@maciekXDDD: nie wiem jak wyglądają twoje dane ale na logikę potrzebujesz niedzielę oznaczyć jako poniedziałek i na tym zagregować/zgrupować. W zależności jakiego dialektu sql używasz mozesz uzyc funkcji np. Datename w sql serverze które ci zwróci dzień tygodnia.

Druga opcja to zrobić temp tabele/cte z zagregowanymi danymi dla niedziel.
I nastepnie polaczyc ja z twoja tabela glowna w ten sposob ze laczysz po tabelaglowna.dzien - 1 = tabelazniedziela.dzien (czyli dla kazdego
natomiast potrzebuje wartości z niedzieli dodać do wartości poniedziałkowej.


@maciekXDDD: Mając już dane w pandas napisałbym sobie funkcję sprawdzającą czy dany dzień jest niedzielą i zamienił ten dzień na poniedziałek, co z resztą powyżej już wskazano.

from datetime import datetime as dt
from datetime import timedelta as td
def is_sunday(date):
if date.isoweekday() == 7:
return date+td(days=1)
else:
return date
i dalej już w dataframe:

df['nowadata'] = df.loc[:,'nazwakolumnyzdata'].map(is_sunday)
@1001001: @maciekXDDD:
tutaj inny - calkiem elegancki - sposób: https://pastebin.com/yVVTcuUM

from io import StringIO

import numpy as np
import pandas as pd

data = StringIO("""date_and_time,value
2020-01-05 00:00:00,-13
2020-01-02 01:00:00,22
2020-01-02 02:00:00,65
2020-01-02 03:00:00,-17
2020-01-02 04:00:00,-4
2020-01-02 05:00:00,5
""")

df = pd.read_csv(data,parse_dates=['date_and_time']) # type: ignore

`df['dt_sundays_as_mondays'] = np.select(`
`[df['date_and_time'].dt.dayofweek == 6],`
`[df['date_and_time'].dt.date+pd.Timedelta(days=1)],`
`default=df['date_and_time'].dt.date`
`)`

aggregated_df = df.groupby('dt_sundays_as_mondays').sum('value')

print(aggregated_df)