求助:如何用前一天同一时间的数据填充Pandas缺失值?
用前一天同一时间数据填充Pandas缺失值的解决方案
嘿,我看你尝试用前一天同一时刻的数据填充DataFrame里的缺失值,但原代码没达到预期——这是因为你直接用当日的时间戳去匹配前一天的时间戳,两者时间节点完全不同,map自然找不到对应的值。咱们来调整下逻辑:
问题分析
你的核心需求是:当某一天的某个时间点Value为空时,用前一天同一时间点的Value来填充。原代码的问题在于,你用缺失值的DateTime(比如10-01-2016 02:00)去映射前一天的DateTime(09-01-2016 02:00),这两个是完全不同的时间戳,根本匹配不到数据。
正确实现方案
我们需要先把缺失值对应的时间减去一天,得到前一天的同一时间点,再用这个时间点去查找对应的值来填充。下面是具体代码:
import pandas as pd # 读取数据,注意指定日期格式为DD-MM-YYYY HH:MM,避免解析错误 df = pd.read_csv('input_3.csv') df['DateTime'] = pd.to_datetime(df['DateTime'], format='%d-%m-%Y %H:%M') # 将DateTime设置为索引,方便按时间查找数据 df = df.set_index('DateTime') # 填充缺失值:对每个缺失的Value,用前一天同一时间的值替换 df['Value'] = df['Value'].fillna( # 把缺失值对应的索引(时间)减去一天,得到前一天的时间 df.index - pd.Timedelta(days=1) # 用这个时间去索引原DataFrame的Value,得到对应的值 ).map(df['Value']) # 重置索引(如果需要回到原来的结构) df = df.reset_index() print(df)
验证结果
用你提供的测试数据运行这段代码后,今日的缺失值会被正确填充:
10-01-2016 02:00的缺失值会被填充为09-01-2016 02:00的410-01-2016 03:00的缺失值会被填充为09-01-2016 03:00的5
如果你的预期结果是填充前一天的下一个小时数据(比如今日02:00用昨日03:00的值),只需要把pd.Timedelta(days=1)改成pd.Timedelta(days=1, hours=1)即可,根据实际需求调整时间偏移量。
另一种实现方式(用apply逐行处理)
如果你更习惯用apply逐行处理,也可以这样写:
import pandas as pd df = pd.read_csv('input_3.csv') df['DateTime'] = pd.to_datetime(df['DateTime'], format='%d-%m-%Y %H:%M') # 创建一个前一天同一时间的临时列 df['prev_day_time'] = df['DateTime'] - pd.Timedelta(days=1) # 构建前一天时间到Value的映射字典 prev_day_map = df.set_index('DateTime')['Value'].to_dict() # 逐行填充缺失值 df['Value'] = df.apply( lambda row: prev_day_map.get(row['prev_day_time'], row['Value']) if pd.isna(row['Value']) else row['Value'], axis=1 ) # 移除临时列 df = df.drop('prev_day_time', axis=1) print(df)
内容的提问来源于stack exchange,提问作者user8866270
相关产品推荐
相关产品推荐

