[英]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.