在 pandas 数据框中插入缺失的工作日并用 NaN 填充它们
Insert missing weekdays in pandas dataframe and fill them with NaN
我正在尝试在具有
的时间序列数据框中插入缺失的工作日
import pandas as pd
from pandas.tseries.offsets import *
df = pd.DataFrame([['2016-09-30', 10, 2020], ['2016-10-03', 20, 2424], ['2016-10-05', 5, 232]], columns=['date', 'price', 'vol']).set_index('date')
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
数据如下所示:
Out[300]:
price vol
date
2016-09-30 10 2020
2016-10-03 20 2424
2016-10-05 5 232
我可以使用 pd.date_range()
轻松创建一系列工作日
pd.date_range('2016-09-30', '2016-10-05', freq=BDay())
Out[301]: DatetimeIndex(['2016-09-30', '2016-10-03', '2016-10-04', '2016-10-05'], dtype='datetime64[ns]', freq='B')
基于那个 DateTimeIndex 我想在我的 df
中添加缺失的日期并用 NaN 填充列值所以我得到:
Out[300]:
price vol
date
2016-09-30 10 2020
2016-10-03 20 2424
2016-10-04 NaN NaN
2016-10-05 5 232
有没有简单的方法来做到这一点?谢谢!
您可以使用重建索引:
df.index = pd.to_datetime(df.index)
df.reindex(pd.date_range('2016-09-30', '2016-10-05', freq=BDay()))
Out:
price vol
2016-09-30 10.0 2020.0
2016-10-03 20.0 2424.0
2016-10-04 NaN NaN
2016-10-05 5.0 232.0
或者,您可以使用 pandas.DataFrame.resample(),为 工作日 指定 'B',无需像数据框一样指定开始或结束日期序列维护一个日期时间索引
df = df.resample('B').sum()
# price vol
# date
# 2016-09-30 10.0 2020.0
# 2016-10-03 20.0 2424.0
# 2016-10-04 NaN NaN
# 2016-10-05 5.0 232.0
我正在尝试在具有
的时间序列数据框中插入缺失的工作日import pandas as pd
from pandas.tseries.offsets import *
df = pd.DataFrame([['2016-09-30', 10, 2020], ['2016-10-03', 20, 2424], ['2016-10-05', 5, 232]], columns=['date', 'price', 'vol']).set_index('date')
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
数据如下所示:
Out[300]:
price vol
date
2016-09-30 10 2020
2016-10-03 20 2424
2016-10-05 5 232
我可以使用 pd.date_range()
pd.date_range('2016-09-30', '2016-10-05', freq=BDay())
Out[301]: DatetimeIndex(['2016-09-30', '2016-10-03', '2016-10-04', '2016-10-05'], dtype='datetime64[ns]', freq='B')
基于那个 DateTimeIndex 我想在我的 df
中添加缺失的日期并用 NaN 填充列值所以我得到:
Out[300]:
price vol
date
2016-09-30 10 2020
2016-10-03 20 2424
2016-10-04 NaN NaN
2016-10-05 5 232
有没有简单的方法来做到这一点?谢谢!
您可以使用重建索引:
df.index = pd.to_datetime(df.index)
df.reindex(pd.date_range('2016-09-30', '2016-10-05', freq=BDay()))
Out:
price vol
2016-09-30 10.0 2020.0
2016-10-03 20.0 2424.0
2016-10-04 NaN NaN
2016-10-05 5.0 232.0
或者,您可以使用 pandas.DataFrame.resample(),为 工作日 指定 'B',无需像数据框一样指定开始或结束日期序列维护一个日期时间索引
df = df.resample('B').sum()
# price vol
# date
# 2016-09-30 10.0 2020.0
# 2016-10-03 20.0 2424.0
# 2016-10-04 NaN NaN
# 2016-10-05 5.0 232.0