如何在Pandas中补全非标准24小时时间戳的缺失数据?
补全时间序列缺失记录的解决方案
Pandas 实现方案
先确认现有时间戳的范围,生成连续完整的时间戳序列,再与原数据左连接填充缺失值:
import pandas as pd # 获取时间戳边界,生成完整连续序列 min_ts = df['timestamp(24hrs)'].min() max_ts = df['timestamp(24hrs)'].max() full_ts = pd.DataFrame({'timestamp(24hrs)': range(min_ts, max_ts + 1)}) # 左连接原数据,填充缺失的count为0 df_complete = pd.merge(full_ts, df, on='timestamp(24hrs)', how='left').fillna({'count': 0})
如果timestamp(24hrs)是datetime格式,可改用pd.date_range生成连续时间序列:
full_ts = pd.DataFrame({'timestamp(24hrs)': pd.date_range(start=min_ts, end=max_ts, freq='H')})
Spark 修正实现方案
针对你之前尝试Spark未成功的情况,可通过生成连续序列+左连接的方式补全:
from pyspark.sql import SparkSession from pyspark.sql.functions import explode, sequence spark = SparkSession.builder.appName("FillMissingTimeSeries").getOrCreate() # 获取时间戳的最小、最大值 ts_bounds = df.selectExpr("min(`timestamp(24hrs)`)", "max(`timestamp(24hrs)`)" ).collect()[0] min_ts, max_ts = ts_bounds[0], ts_bounds[1] # 生成完整连续时间戳序列 full_ts_df = spark.sql(f"SELECT explode(sequence({min_ts}, {max_ts}, 1)) AS `timestamp(24hrs)`") # 左连接原数据并填充缺失count为0 df_complete = full_ts_df.join(df, on='timestamp(24hrs)', how='left') \ .fillna(0, subset=['count'])
注意事项
- 若
timestamp(24hrs)是字符串/日期类型,需先转换为数值型时间戳,或调整序列生成逻辑:# 示例:针对datetime类型的时间戳 full_ts_df = spark.sql(""" SELECT explode(sequence(to_timestamp(min_ts), to_timestamp(max_ts), interval 1 hour)) AS `timestamp(24hrs)` """) - 确保原表与生成的序列表中
timestamp(24hrs)的类型完全一致,避免连接失败。
内容的提问来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

