Python Pandas 正向填充特定时间范围内的缺失数据
Python Pandas forward fill missing data in specific time range
我有一个 pandas 数据框,如下所示:
如您所见 - 在日期时间索引中,缺少某些分钟数。例如,在屏幕截图中,第一行和第二行之间缺少 9:16:00 - 9:19:00 分钟。我想将前一分钟的数据转发到所有缺失的分钟。
现在,我们到达了变得复杂的部分 - 以及我需要帮助的部分。我只需要在每个日期的 09:15:00 和 15:30:00 之间转发填充分钟数。并且,对于前向填充的任何行,列 Volume
的值应为 0
为了帮助您探索数据,我将前几行导出到一个 json 对象 (我认为日期时间索引已转换为毫秒)
{
"1580464080000": {
"expiry": "4/30/2020",
"close": 12157.3,
"high": 12157.3,
"volume": 0,
"open": 12157.3,
"low": 12157.3,
"timezone": "+05:30"
},
"1580463120000": {
"expiry": "4/30/2020",
"close": 12200.3,
"high": 12200.3,
"volume": 0,
"open": 12200.3,
"low": 12200.3,
"timezone": "+05:30"
},
"1580464260000": {
"expiry": "4/30/2020",
"close": 12150.0,
"high": 12150.0,
"volume": 0,
"open": 12150.0,
"low": 12150.0,
"timezone": "+05:30"
},
"1580462400000": {
"expiry": "4/30/2020",
"close": 12174.0,
"high": 12174.0,
"volume": 0,
"open": 12174.0,
"low": 12174.0,
"timezone": "+05:30"
},
"1580462820000": {
"expiry": "4/30/2020",
"close": 12193.7,
"high": 12193.7,
"volume": 0,
"open": 12193.7,
"low": 12193.7,
"timezone": "+05:30"
},
"1580462100000": {
"expiry": "4/30/2020",
"close": 12180.0,
"high": 12180.0,
"volume": 0,
"open": 12180.0,
"low": 12180.0,
"timezone": "+05:30"
},
"1580464440000": {
"expiry": "4/30/2020",
"close": 12160.45,
"high": 12160.45,
"volume": 0,
"open": 12160.45,
"low": 12160.45,
"timezone": "+05:30"
}
}
我建议您使用 pandas 重采样方法。它将数据帧重新采样为指定格式。步骤是:
使用 pandas 重采样方法重采样。 '1T' 代表分钟。您可以在此处查看其他频率:https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#timeseries-offset-aliases
然后删除不需要的时间,即在9:15到15:30之外使用between_time。
然后用 0 为 'volume' 填写 NA,并向前填充剩余的列。
向前填写剩余的列
这是一个示例代码:
# Get unique dates from the data frame
df['Date'] = df.index.date
sample_days = df['Date'].unique()
# Resample to 1 minute and keep only the original dates
df = df.resample('1t').last()
df = df.loc[df['Date'].isin(sample_days)]
# Remove non open hours
df = df.between_time('09:15', '15:30')
# Fill 0 in Na for volume
df['volume'] = df['volume'].fillna(0)
# Forward fill the remaining columns (notice, as NAs in volume are removed, it does effect this column)
df = df.fillna(method='ffill')
我有一个 pandas 数据框,如下所示:
如您所见 - 在日期时间索引中,缺少某些分钟数。例如,在屏幕截图中,第一行和第二行之间缺少 9:16:00 - 9:19:00 分钟。我想将前一分钟的数据转发到所有缺失的分钟。
现在,我们到达了变得复杂的部分 - 以及我需要帮助的部分。我只需要在每个日期的 09:15:00 和 15:30:00 之间转发填充分钟数。并且,对于前向填充的任何行,列 Volume
的值应为 0
为了帮助您探索数据,我将前几行导出到一个 json 对象 (我认为日期时间索引已转换为毫秒)
{
"1580464080000": {
"expiry": "4/30/2020",
"close": 12157.3,
"high": 12157.3,
"volume": 0,
"open": 12157.3,
"low": 12157.3,
"timezone": "+05:30"
},
"1580463120000": {
"expiry": "4/30/2020",
"close": 12200.3,
"high": 12200.3,
"volume": 0,
"open": 12200.3,
"low": 12200.3,
"timezone": "+05:30"
},
"1580464260000": {
"expiry": "4/30/2020",
"close": 12150.0,
"high": 12150.0,
"volume": 0,
"open": 12150.0,
"low": 12150.0,
"timezone": "+05:30"
},
"1580462400000": {
"expiry": "4/30/2020",
"close": 12174.0,
"high": 12174.0,
"volume": 0,
"open": 12174.0,
"low": 12174.0,
"timezone": "+05:30"
},
"1580462820000": {
"expiry": "4/30/2020",
"close": 12193.7,
"high": 12193.7,
"volume": 0,
"open": 12193.7,
"low": 12193.7,
"timezone": "+05:30"
},
"1580462100000": {
"expiry": "4/30/2020",
"close": 12180.0,
"high": 12180.0,
"volume": 0,
"open": 12180.0,
"low": 12180.0,
"timezone": "+05:30"
},
"1580464440000": {
"expiry": "4/30/2020",
"close": 12160.45,
"high": 12160.45,
"volume": 0,
"open": 12160.45,
"low": 12160.45,
"timezone": "+05:30"
}
}
我建议您使用 pandas 重采样方法。它将数据帧重新采样为指定格式。步骤是:
使用 pandas 重采样方法重采样。 '1T' 代表分钟。您可以在此处查看其他频率:https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#timeseries-offset-aliases
然后删除不需要的时间,即在9:15到15:30之外使用between_time。
然后用 0 为 'volume' 填写 NA,并向前填充剩余的列。
向前填写剩余的列
这是一个示例代码:
# Get unique dates from the data frame
df['Date'] = df.index.date
sample_days = df['Date'].unique()
# Resample to 1 minute and keep only the original dates
df = df.resample('1t').last()
df = df.loc[df['Date'].isin(sample_days)]
# Remove non open hours
df = df.between_time('09:15', '15:30')
# Fill 0 in Na for volume
df['volume'] = df['volume'].fillna(0)
# Forward fill the remaining columns (notice, as NAs in volume are removed, it does effect this column)
df = df.fillna(method='ffill')