You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 08:10:24