Pandas基于日期匹配赋值问题:时间组件影响与解决方案
Pandas按日期忽略时间赋值的问题解答
1. 为何带有非00:00时间组件时该方法失效?
df1.index.date返回的是datetime.date对象数组,当用它作为.loc的行索引时,Pandas会自动把这些date对象转换成和df1索引同类型的datetime64[ns]类型,也就是补全为当天的00:00:00时间点。
如果df1的索引里刚好有该日期的00:00:00行,就能匹配到标签;但如果df1索引起始是01:00,当天没有00:00:00的行,转换后的datetime标签不存在于df1的索引中,自然触发KeyError。
2. 为何无特殊时间组件时该方法能匹配所有时间点而非仅00:00?
当df1索引包含00:00:00时,df1.index.date转换后的00:00:00 datetime标签是存在于df1索引中的。此时.loc会遍历df1每一行对应的date标签,找到df2中对应日期的值,再通过Pandas的赋值广播机制,把该日期的df2值填充到df1所有同日期的行里——本质是逐行按标签匹配后赋值,所以看起来像是匹配了所有时间点,而非仅00:00的那一行。
3. 实现按日期忽略时间匹配赋值的正确方式是什么?
这里提供三种实用的实现方式:
- 方法一:利用
map匹配日期
先将df2转为以日期为键的字典,再用df1的日期索引映射赋值:# 确保df2的索引是datetime.date类型(若不是,先转换:df2.index = df2.index.date) date_value_map = df2[['v3', 'v4']].to_dict(orient='index') df1[['v3', 'v4']] = df1.index.date.map(date_value_map) - 方法二:按日期分组后广播赋值
通过groupby按日期分组,每组直接取df2对应日期的值,自动广播到组内所有行:df1[['v3', 'v4']] = df1.groupby(df1.index.date)[['v3', 'v4']].transform( lambda group: df2.loc[group.name] ) - 方法三:对齐日期起始时间戳
将df1的索引向下取整到当天起始(00:00),直接匹配df2的datetime索引:# 确保df2的索引是datetime64类型(补全00:00,比如:df2.index = pd.to_datetime(df2.index)) df1[['v3', 'v4']] = df2.loc[df1.index.floor('D'), ['v3', 'v4']].values
内容的提问来源于stack exchange,提问作者levant pied
相关产品推荐
相关产品推荐

