【Pandas】ある一定の期間のデータを取り出して、欠損する日付を埋めて、存在しないデータを0で埋める

先日、python の defaultdict を用いて辞書の重複した値のキーの数を取得しました。

【Python】辞書の重複した値のキーの数を取得する

今回は pandas、django-pandas で、データをDataFrame形式にし、重複するデータの数を出して、飛び飛びになっている時系列データの欠損を埋めてみました。

モデルの例

class Test(models.Model):

    class Meta:
        db_table    = "test"

    id   = models.UUIDField( default=uuid.uuid4, primary_key=True, editable=False )
    dt   = models.DateTimeField(verbose_name="",default=timezone.now)
    test = models.CharField(verbose_name="", max_length=50)
データの整形方法

views.py

from django_pandas.io import read_frame
import pandas as pd
from datetime import date, timedelta

test = Test.objects.all()

df = read_frame(test, fieldnames=['dt', 'test'])
df["date"] = [ d.date() for d in df.dt ]
a = df.loc[:,['date','test']]

b = a.pivot_table(index = ['date'], aggfunc = 'size')
c = b.reset_index()
d = c.set_axis(['date','test_num'],axis=1)

## 一度に書くとこうなる 
## e = a.pivot_table(index = ['date'], aggfunc = 'size').reset_index().set_axis(['date','test_num'],axis=1)

print("====================")
print(b)
print("====================")
print(c)
print("====================")
print(d)
print("====================")

## (結果)
====================
date
2022-08-12    4
dtype: int64
====================
         date  0
0  2022-08-12  4
====================
         date  test_num
0  2022-08-12         4
====================

次に、オブジェクトをある一定の期間で取り出して、欠損する日付を埋めて、存在しないデータを0で埋める場合。

today = timezone.now()
past_day = today - datetime.timedelta(days=28)

test = Test.objects.filter(dt__gte=past_day, dt__lte=today).order_by("dt")

df = read_frame(test, fieldnames=['dt', 'test'])
df["date"] = [ d.date() for d in df.dt ]
a = df.loc[:,['date','test']]

b          = a.pivot_table(index = ['date'], aggfunc = 'size').reset_index().set_axis(['date','test_num'],axis=1)
start_time = pd.to_datetime(past_day.date())
end_time   = pd.to_datetime(today.date())
time_list  = pd.date_range(start_time, end_time, freq='D')
df         = b.set_index('date').reindex(time_list, fill_value=0)


## (結果)

              test_num
2022-07-19             0
2022-07-20             0
2022-07-21             0
2022-07-22             0
...

2022-08-12             4
2022-08-13             0
2022-08-14             0
2022-08-15             0
参考記事

django-pandas 0.6.6

DjangoでPandas(DataFrame)を活用する方法

Pandasの日付が縦に並んでいるデータフレームで、欠けている日付の行を補う方法と気をつけること

Pandas.DataFrameでとびとびの時系列データを補完する

[python] pandasのreindexとdate_rangeを利用して、時系列データの欠損を埋める

pandas.DataFrameの行名・列名の変更

お薦め

【静岡県浜松市】コロナ陽性者5万人を調査した結果、ワクチンを何度接種しても重症化率に変わりがないことが判明

【中国・恒大集団】電気自動車(EV)事業に参入するも、生産工場が空の状態になっていることが判明 資金繰り悪化で生産困難か

自分の中から聖書に書かれた罪をなくすことで、不安や心配がなくなり、喜びの涙で溢れる毎日を生きられるようになった(十二弟子・ミナさんの証)