如何为DataFrame中缺失指定时段数据的日期填充NaN
提取每日指定时段数据并保留缺失日期填充NaN
需求说明
需要提取DataFrame中每日15:30:00.0时段的Last字段值,但2023-01-16当天缺少13:00:00.0至15:30:00.0的所有数据行,期望保留该日期并将对应Last值设为NaN。
现有DataFrame
Date Time Open High Low Last 0 2023-01-13 09:30:00.0 3968.25 3985 3965.75 3980.25 1 2023-01-13 10:00:00.0 3980 3998.5 3974 3998 2 2023-01-13 10:30:00.0 3998 4000.75 3991.25 3996.75 3 2023-01-13 11:00:00.0 3996.5 3999 3986.25 3992.75 4 2023-01-13 11:30:00.0 3993 3993.5 3985 3990.75 5 2023-01-13 12:00:00.0 3990.75 3998.75 3989.75 3997.5 6 2023-01-13 12:30:00.0 3997.5 4002 3993 3999.75 7 2023-01-13 13:00:00.0 4000 4002.25 3993.75 3997.5 8 2023-01-13 13:30:00.0 3997.25 4010 3996.25 4008.25 9 2023-01-13 14:00:00.0 4008 4010.75 4004.25 4008.75 10 2023-01-13 14:30:00.0 4009 4011.75 4006.25 4009.5 11 2023-01-13 15:00:00.0 4009.75 4016 4009 4016 12 2023-01-13 15:30:00.0 4016 4024.25 4014.75 4017.75 13 2023-01-16 09:30:00.0 4014.75 4019.25 4014.75 4017.5 14 2023-01-16 10:00:00.0 4017.75 4020 4015.5 4017.25 15 2023-01-16 10:30:00.0 4017 4020.5 4017 4018.25 16 2023-01-16 11:00:00.0 4018 4019.5 4015.75 4016.75 17 2023-01-16 11:30:00.0 4016.75 4017 4010.5 4012 18 2023-01-16 12:00:00.0 4012.25 4013 4010.75 4010.75 19 2023-01-16 12:30:00.0 4010.75 4015 4008 4010 20 2023-01-17 09:30:00.0 4018 4024.25 4008.75 4018.25 21 2023-01-17 10:00:00.0 4018.5 4035.25 4018.5 4030.25 22 2023-01-17 10:30:00.0 4030.25 4031.25 4010.5 4014.75 23 2023-01-17 11:00:00.0 4014.75 4017.25 4002.75 4009.5 24 2023-01-17 11:30:00.0 4009.25 4016.25 4008.25 4014.5 25 2023-01-17 12:00:00.0 4014.75 4019 4007.25 4008.25 26 2023-01-17 12:30:00.0 4008.5 4016 4007.75 4013.5 27 2023-01-17 13:00:00.0 4013.75 4016.5 4011.5 4014 28 2023-01-17 13:30:00.0 4014.25 4020.5 4012.75 4019 29 2023-01-17 14:00:00.0 4019.25 4021 4008.25 4010.75 30 2023-01-17 14:30:00.0 4011 4019.5 4010.75 4013.75 31 2023-01-17 15:00:00.0 4013.75 4018.25 4010.25 4012 32 2023-01-17 15:30:00.0 4011.75 4014.25 4003.75 4010
当前代码及输出
当前使用的提取代码:
m = df["Time"].eq("15:30:00.0") out = df[m].groupby(["Date", "Time"], as_index=False)["Last"].max()
运行后输出:
Date Time Last 0 2023-01-13 15:30:00.0 4017.75 1 2023-01-17 15:30:00.0 4010
期望输出
Date Time Last 0 2023-01-13 15:30:00.0 4017.75 1 2023-01-16 15:30:00.0 NaN 2 2023-01-17 15:30:00.0 4010
解决方案
可以实现该需求,核心思路是先构造包含所有日期和目标时段的完整数据集,再与筛选出的有效数据做左连接,缺失的记录会自动填充NaN。具体代码如下:
import pandas as pd # 1. 获取所有唯一日期 unique_dates = df['Date'].unique() # 2. 构造包含所有日期和目标时段的完整索引 full_data = pd.DataFrame({ 'Date': unique_dates, 'Time': '15:30:00.0' }) # 3. 筛选原数据中15:30时段的记录 filtered_data = df[df['Time'] == '15:30:00.0'][['Date', 'Time', 'Last']] # 4. 左连接完整索引与筛选数据,保留所有日期 out = pd.merge(full_data, filtered_data, on=['Date', 'Time'], how='left') print(out)
运行上述代码后,即可得到期望的输出结果。
另一种实现方式(基于groupby和reindex)
也可以先按日期分组提取目标时段数据,再重新索引到所有日期:
# 按Date分组,提取15:30的Last值,无数据则为NaN out = df[df['Time'] == '15:30:00.0'].set_index('Date')['Last'] out = out.reindex(df['Date'].unique()).reset_index() out['Time'] = '15:30:00.0' out = out[['Date', 'Time', 'Last']] print(out)
内容的提问来源于stack exchange,提问作者NoLimitLondon
相关产品推荐
相关产品推荐

