簡體   English   中英

將缺失的日期添加到 pandas dataframe 中,並將零作為值

[英]Add missing dates to pandas dataframe with zeros as values

非常標准的任務:數據可以在給定日期有多個事件或沒有事件。 我采取這些事件,豐富給定范圍和零值的數據缺失日期,所以稍后我可以按日期和 plot 數據計數。

I'm new to pandas and have followed reindex to add missing dates to pandas dataframe and pandas fill missing dates in time series . 盡管它已被許多 stackoverflow 讀者接受,但它對我不起作用,因為它會使已經存在的“數量”列值無效:

CODE: 
    # (items_per_day is coming from DB)
    date_now = datetime.now().date()
    date_period = date_now-timedelta(weeks=1)

    data = list(items_per_day)
    print('data: ', data)

    idx = pd.period_range(date_period, date_now)

    df = pd.DataFrame(data)
    print('df: ', df)

    df.index = pd.DatetimeIndex(df.index)
    print('df index: ', df)

    df = df.reindex(idx, fill_value=0)
    print('df: ', df)

OUTPUT:

data:  [{'date': datetime.date(2022, 8, 17), 'quantity': 1}, {'date': datetime.date(2022, 8, 18), 'quantity': 2}, {'date': datetime.date(2022, 8, 19), 'quantity': 3}]

df:           date  quantity
0  2022-08-17         1
1  2022-08-18         2
2  2022-08-19         3

df index:                                       date  quantity
1970-01-01 00:00:00.000000000  2022-08-17         1
1970-01-01 00:00:00.000000001  2022-08-18         2
1970-01-01 00:00:00.000000002  2022-08-19         3

df:             date  quantity
2022-08-13    0         0
2022-08-14    0         0
2022-08-15    0         0
2022-08-16    0         0
2022-08-17    0         0
2022-08-18    0         0
2022-08-19    0         0
2022-08-20    0         0

看起來重新索引會丟失帶有或不帶有“fill_value”參數的數據! 雖然添加缺失日期 pandas dataframe解決方案基於不同的主要作品:

CODE:
    date_now = datetime.now().date()
    date_period = date_now-timedelta(weeks=1)

    data = list(items_per_day)
    print('data: ', data)

    idx = pd.period_range(date_period, date_now)

    df = pd.DataFrame(data)
    print('df: ', df)

    df['date'] = pd.to_datetime(df['date'])

    dates = pd.date_range(start=date_period, freq='D', periods=7)
    df = df.set_index('date').reindex(dates.normalize().rename('date')).reset_index()
    df['quantity'] = df['quantity'].fillna(0)
    print('df: ', df)

OUTPUT:
data:  [{'date': datetime.date(2022, 8, 17), 'quantity': 1}, {'date': datetime.date(2022, 8, 18), 'quantity': 2}, {'date': datetime.date(2022, 8, 19), 'quantity': 3}]

df:           date  quantity
0  2022-08-17         1
1  2022-08-18         2
2  2022-08-19         3

df:     date  quantity
0 2022-08-13       0.0
1 2022-08-14       0.0
2 2022-08-15       0.0
3 2022-08-16       0.0
4 2022-08-17       1.0
5 2022-08-18       2.0
6 2022-08-19       3.0

我想了解為什么第一個解決方案在我的情況下不起作用(它顯然適用於許多投票給它的人。)? 在我的案例中失敗的根本原因是什么?

在您的第一種方法中,您正在使用PeriodIndex (由 period_range 創建)重新索引DatetimeIndex ,使用date_range而不是period_range有效:

idx = pd.date_range(date_period, date_now)
df.index = pd.DatetimeIndex(df.date)

df.reindex(idx, fill_value=0)
#                  date  quantity
#2022-08-13           0         0
#2022-08-14           0         0
#2022-08-15           0         0
#2022-08-16           0         0
#2022-08-17  2022-08-17         1
#2022-08-18  2022-08-18         2
#2022-08-19  2022-08-19         3
#2022-08-20           0         0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM