如何将含日期与值的DataFrame转换为单行并补全缺失日期
Pandas处理缺失时间序列并转换为单行DataFrame
问题背景
现有包含date和value两列的DataFrame,date列存在时间缺失(如缺少2020-03-04全天数据,部分日期也有缺失的15分钟间隔点),需要完成三个操作:
- 构建包含所有连续15分钟时间点的DataFrame,缺失数据填充为NaN
- 用
value列的均值填充所有NaN值 - 将数据转换为单行结构(每个时间点作为列名,对应值为该行数据)
原始数据
import pandas as pd import numpy as np df = pd.DataFrame() df['date'] = ['2020-03-01 00:00:00','2020-03-01 00:00:15', '2020-03-01 00:00:30', '2020-03-02 00:00:00','2020-03-02 00:00:15', '2020-03-02 00:00:30', '2020-03-03 00:00:15', '2020-03-03 00:00:30', '2020-03-05 00:00:00', '2020-03-05 00:00:30'] df['value'] = [1, 2, 3, 4, 5, 6, 1, 2, 3, 4]
分步解决方案
1. 生成完整时间序列并填充缺失为NaN
先将date列转为datetime类型,再根据原始数据的时间起止点,生成间隔15分钟的完整时间序列,最后通过合并匹配原始数据,缺失的value自动填充为NaN:
# 转换date列为datetime类型 df['date'] = pd.to_datetime(df['date']) # 生成完整的15分钟间隔时间序列 start_date = df['date'].min() end_date = df['date'].max() full_time_index = pd.date_range(start=start_date, end=end_date, freq='15T') # 合并得到完整时间序列的DataFrame full_df = pd.DataFrame({'date': full_time_index}).merge(df, on='date', how='left')
2. 用列均值填充NaN
计算value列的全局均值,直接填充所有缺失值:
value_mean = full_df['value'].mean() full_df['value'] = full_df['value'].fillna(value_mean)
如果需要按天维度填充均值,可替换为:
full_df['value'] = full_df.groupby(full_df['date'].dt.date)['value'].transform(lambda x: x.fillna(x.mean()))
3. 转换为单行DataFrame
使用pivot将时间点转为列名,value转为行值,最后重置索引并调整列名格式:
# 构建单行结构 single_row_df = full_df.pivot(columns='date', values='value').reset_index(drop=True) # 可选:将datetime列名转为字符串,避免后续类型问题 single_row_df.columns = single_row_df.columns.astype(str)
完整代码
import pandas as pd import numpy as np # 原始数据 df = pd.DataFrame() df['date'] = ['2020-03-01 00:00:00','2020-03-01 00:00:15', '2020-03-01 00:00:30', '2020-03-02 00:00:00','2020-03-02 00:00:15', '2020-03-02 00:00:30', '2020-03-03 00:00:15', '2020-03-03 00:00:30', '2020-03-05 00:00:00', '2020-03-05 00:00:30'] df['value'] = [1, 2, 3, 4, 5, 6, 1, 2, 3, 4] # 步骤1:生成完整时间序列 df['date'] = pd.to_datetime(df['date']) start_date = df['date'].min() end_date = df['date'].max() full_time_index = pd.date_range(start=start_date, end=end_date, freq='15T') full_df = pd.DataFrame({'date': full_time_index}).merge(df, on='date', how='left') # 步骤2:均值填充NaN full_df['value'] = full_df['value'].fillna(full_df['value'].mean()) # 步骤3:转换为单行DataFrame single_row_df = full_df.pivot(columns='date', values='value').reset_index(drop=True) single_row_df.columns = single_row_df.columns.astype(str) print(single_row_df)
内容的提问来源于stack exchange,提问作者Sadcow
相关产品推荐
相关产品推荐

