
本文介绍了如何使用 Pandas 填充 DataFrame 中缺失的日期或时间,即使日期时间列不是索引。通过将日期时间列设置为索引,使用 asfreq 函数,并重置索引,可以轻松地填充缺失的日期或时间,并使用指定的值进行填充。本文提供详细的代码示例,适用于不同的时间频率,如天、小时或分钟。
Pandas 提供了强大的时间序列处理功能。当 DataFrame 中的日期或时间序列存在缺失值时,我们需要填充这些缺失值,以保证数据的完整性和后续分析的准确性。 本文将介绍如何使用 Pandas 填充 DataFrame 中缺失的日期或时间,即使日期时间列不是索引列。
解决方案
核心思路是将日期时间列设置为索引,然后使用 asfreq 函数重新采样,填充缺失的日期,最后重置索引。以下是具体步骤:
- 将日期时间列转换为 datetime 类型:确保日期时间列的数据类型是 datetime。可以使用 pd.to_datetime() 函数进行转换。
- 将日期时间列设置为索引:使用 set_index() 函数将日期时间列设置为 DataFrame 的索引。
- 使用 asfreq 填充缺失日期:使用 asfreq() 函数,指定频率(例如,'D' 表示天,'H' 表示小时,'15Min' 表示 15 分钟),并使用 fill_value 参数指定填充缺失值的值。
- 重置索引:使用 reset_index() 函数将索引恢复为列。
代码示例
示例 1:填充缺失的日期(天)
假设我们有以下 DataFrame:
import pandas as pd
data = {'dt_object': ['2000-01-03', '2000-01-04', '2000-01-05', '2000-01-06', '2000-01-07', '2000-01-10', '2000-01-11', '2000-01-12'],
'high': [27.490000, 27.448000, 27.597000, 27.597000, 27.174000, 28.090000, 29.250000, 28.850000]}
df = pd.DataFrame(data)
print(df)输出:
dt_object high 0 2000-01-03 27.490 1 2000-01-04 27.448 2 2000-01-05 27.597 3 2000-01-06 27.597 4 2000-01-07 27.174 5 2000-01-10 28.090 6 2000-01-11 29.250 7 2000-01-12 28.850
可以看到,2000-01-08 和 2000-01-09 缺失。以下代码填充这些缺失的日期,并使用 0 填充 high 列:
df['dt_object'] = pd.to_datetime(df['dt_object'])
out = df.set_index('dt_object').asfreq('D', fill_value=0).reset_index()
print(out)输出:
dt_object high 0 2000-01-03 27.490 1 2000-01-04 27.448 2 2000-01-05 27.597 3 2000-01-06 27.597 4 2000-01-07 27.174 5 2000-01-08 0.000 6 2000-01-09 0.000 7 2000-01-10 28.090 8 2000-01-11 29.250 9 2000-01-12 28.850
示例 2:填充缺失的时间(15 分钟)
假设我们有以下 DataFrame:
data = {'dt_object': ['2023-12-13 00:00:00', '2023-12-13 00:15:00', '2023-12-13 00:45:00', '2023-12-13 01:15:00'],
'high': [90.1216, 90.1308, 90.2750, 90.3023]}
df = pd.DataFrame(data)
print(df)输出:
dt_object high 0 2023-12-13 00:00:00 90.1216 1 2023-12-13 00:15:00 90.1308 2 2023-12-13 00:45:00 90.2750 3 2023-12-13 01:15:00 90.3023
以下代码填充缺失的 15 分钟间隔,并使用 0 填充 high 列:
df['dt_object'] = pd.to_datetime(df['dt_object'])
out = df.set_index('dt_object').asfreq('15Min', fill_value=0).reset_index()
print(out)输出(部分):
dt_object high 0 2023-12-13 00:00:00 90.1216 1 2023-12-13 00:15:00 90.1308 2 2023-12-13 00:30:00 0.0000 3 2023-12-13 00:45:00 90.2750 4 2023-12-13 01:00:00 0.0000 5 2023-12-13 01:15:00 90.3023
注意事项
- asfreq 函数只能用于具有日期时间索引的 DataFrame。
- fill_value 参数可以设置为任何值,具体取决于你的需求。
- freq 参数的取值请参考 Pandas 官方文档,例如:'D' (天), 'H' (小时), 'T' 或 'min' (分钟), 'S' (秒)。
总结
本文介绍了使用 Pandas 填充 DataFrame 中缺失日期或时间的通用方法。通过将日期时间列设置为索引,使用 asfreq 函数,并重置索引,可以轻松地填充缺失的日期或时间,并使用指定的值进行填充。 这种方法适用于不同的时间频率,可以灵活地应用于各种时间序列数据处理场景。










