Pandas 二十四:怎么处理日期索引的缺失?

问题:按日期统计的数据,缺失了某天,导致数据不全该怎么补充日期?

可以用两种方法实现:
1、DataFrame.reindex,调整dataframe的索引以适应新的索引
2、DataFrame.resample,可以对时间序列重采样,支持补充缺失值

问题:如果缺失了索引该怎么填充?

1

import pandas as pd
%matplotlib inline

2

df = pd.DataFrame({
    "pdate": ["2019-12-01", "2019-12-02", "2019-12-04", "2019-12-05"],
    "pv": [100, 200, 400, 500],
    "uv": [10, 20, 40, 50],
})

df

2

pdate	pv	uv
0	2019-12-01	100	10
1	2019-12-02	200	20
2	2019-12-04	400	40
3	2019-12-05	500	50

3

df.set_index("pdate").plot()

3
<matplotlib.axes._subplots.AxesSubplot at 0x7fbe91cdbaf0>

问题,这里缺失了2019-12-03的数据,导致数据不全该怎么补充?

方法1:使用pandas.reindex方法

1、将df的索引变成日期索引

4

df_date = df.set_index("pdate")
df_date

4

pv	uv
pdate		
2019-12-01	100	10
2019-12-02	200	20
2019-12-04	400	40
2019-12-05	500	50

5

df_date.index

5

Index(['2019-12-01', '2019-12-02', '2019-12-04', '2019-12-05'], dtype='object', name='pdate')

6

# 将df的索引设置为日期索引
df_date = df_date.set_index(pd.to_datetime(df_date.index))
df_date

6

pv	uv
pdate		
2019-12-01	100	10
2019-12-02	200	20
2019-12-04	400	40
2019-12-05	500	50

7

df_date.index

7

DatetimeIndex(['2019-12-01', '2019-12-02', '2019-12-04', '2019-12-05'], dtype='datetime64[ns]', name='pdate', freq=None)
2、使用pandas.reindex填充缺失的索引

8

# 生成完整的日期序列
pdates = pd.date_range(start="2019-12-01", end="2019-12-05")
pdates

8

DatetimeIndex(['2019-12-01', '2019-12-02', '2019-12-03', '2019-12-04',
               '2019-12-05'],
              dtype='datetime64[ns]', freq='D')

9

df_date_new = df_date.reindex(pdates, fill_value=0)
df_date_new

9

pv	uv
2019-12-01	100	10
2019-12-02	200	20
2019-12-03	0	0
2019-12-04	400	40
2019-12-05	500	50

10

df_date_new.plot()

10
<matplotlib.axes._subplots.AxesSubplot at 0x7fbe91cdbd90>

方法2:使用pandas.resample方法

1、先将索引变成日期索引

11

df

11

	pdate	pv	uv
0	2019-12-01	100	10
1	2019-12-02	200	20
2	2019-12-04	400	40
3	2019-12-05	500	50

12

df_new2 = df.set_index(pd.to_datetime(df["pdate"])).drop("pdate", axis=1)
df_new2

12

			pv	uv
pdate		
2019-12-01	100	10
2019-12-02	200	20
2019-12-04	400	40
2019-12-05	500	50

13

df_new2.index

13

DatetimeIndex(['2019-12-01', '2019-12-02', '2019-12-04', '2019-12-05'], dtype='datetime64[ns]', name='pdate', freq=None)
2、使用dataframe的resample的方法按照天重采样

resample的含义:
改变数据的时间频率,比如把天数据变成月份,或者把小时数据变成分钟级别

resample的语法:
(DataFrame or Series).resample(arguments).(aggregate function)

resample的采样规则参数:
https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases

14

# 由于采样会让区间变成一个值,所以需要指定mean等采样值的设定方法
df_new2 = df_new2.resample("D").mean().fillna(0)
df_new2

14

						pv	uv
pdate		
2019-12-01	100.0	10.0
2019-12-02	200.0	20.0
2019-12-03	0.0	0.0
2019-12-04	400.0	40.0
2019-12-05	500.0	50.0

15

# resample的使用方式
df_new2.resample("2D").mean()

15

			  pv     uv
  pdate		
2019-12-01	150.0	15.0
2019-12-03	200.0	20.0
2019-12-05	500.0	50.0
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值