Pandas 时间序列数据处理:按特定日期条件提取列值与填充NaN

Pandas 时间序列数据处理:按特定日期条件提取列值与填充NaN

本文详细介绍了在pandas dataframe中根据特定日期或日期时间条件提取列值,并将不符合条件的行填充为nan的多种高效方法。重点讲解了利用`series.where()`进行矢量化条件赋值,以及通过部分字符串索引进行批量操作。同时,文章也分析了传统`iterrows`循环的性能问题及正确使用方式,强调了在处理时间序列数据时应优先采用矢量化操作以提升效率和代码可读性

在数据分析中,我们经常需要根据DataFrame的日期或时间索引来筛选或修改数据。例如,我们可能需要在一个特定的日期提取某个列的值,而其他日期则填充为NaN。虽然初学者可能会倾向于使用循环来解决这类问题,但Pandas提供了更高效、更简洁的矢量化方法。本文将详细探讨这些方法。

高效的矢量化解决方案

Pandas的矢量化操作能够显著提高数据处理的效率,尤其是在处理大型数据集时。以下是几种推荐的方法。

1. 使用 Series.where() 进行日期条件筛选

Series.where() 方法允许您根据一个布尔条件选择性地保留或替换Series中的值。当条件为True时,保留原始值;当条件为False时,替换为指定值(默认为NaN)。

如果DataFrame的索引是DatetimeIndex类型,并且您希望只根据日期部分进行匹配,忽略时间,可以使用df.index.normalize()将所有时间戳规范化为午夜(00:00:00)。

示例代码:

import pandas as pd# 创建一个包含时间部分的DatetimeIndexrng = pd.date_range('2000-03-19', periods=10, freq='9H')df = pd.DataFrame({'close': range(10)}, index=rng)print("原始DataFrame:")print(df)# 使用Series.where(),并忽略时间部分进行日期匹配# df.index.normalize() 将所有时间戳的时间部分设为00:00:00# pd.Timestamp('2000-03-20') 创建一个目标日期时间戳df['event'] = df['close'].where(df.index.normalize() == pd.Timestamp('2000-03-20'))print("n使用 df.index.normalize() 和 Series.where() 后的DataFrame:")print(df)

输出示例:

ProWritingAid ProWritingAid

AI写作助手软件

ProWritingAid 114 查看详情 ProWritingAid

原始DataFrame:                     close2000-03-19 00:00:00      02000-03-19 09:00:00      12000-03-19 18:00:00      22000-03-20 03:00:00      32000-03-20 12:00:00      42000-03-20 21:00:00      52000-03-21 06:00:00      62000-03-21 15:00:00      72000-03-22 00:00:00      82000-03-22 09:00:00      9使用 df.index.normalize() 和 Series.where() 后的DataFrame:                     close  event2000-03-19 00:00:00      0    NaN2000-03-19 09:00:00      1    NaN2000-03-19 18:00:00      2    NaN2000-03-20 03:00:00      3    3.02000-03-20 12:00:00      4    4.02000-03-20 21:00:00      5    5.02000-03-21 06:00:00      6    NaN2000-03-21 15:00:00      7    NaN2000-03-22 00:00:00      8    NaN2000-03-22 09:00:00      9    NaN

如果您的索引本身就只包含日期(没有时间部分),或者您需要精确匹配某个带时间的时间戳,可以直接进行比较:

# 创建一个只包含日期的DatetimeIndexrng_daily = pd.date_range('2000-03-19', periods=10)df_daily = pd.DataFrame({'close': range(10)}, index=rng_daily)print("n原始DataFrame (每日数据):")print(df_daily)# 精确匹配特定日期df_daily['event'] = df_daily['close'].where(df_daily.index == '2000-03-20')print("n使用 Series.where() 精确匹配特定日期后的DataFrame:")print(df_daily)

输出示例:

原始DataFrame (每日数据):            close2000-03-19      02000-03-20      12000-03-21      22000-03-22      32000-03-23      42000-03-24      52000-03-25      62000-03-26      72000-03-27      82000-03-28      9使用 Series.where() 精确匹配特定日期后的DataFrame:            close  event2000-03-19      0    NaN2000-03-20      1    1.02000-03-21      2    NaN2000-03-22      3    NaN2000-03-23      4    NaN2000-03-24      5    NaN2000-03-25      6    NaN2000-03-26      7    NaN2000-03-27      8    NaN2000-03-28      9    NaN

2. 利用部分字符串索引进行日期范围赋值

Pandas的DatetimeIndex支持部分字符串索引,这意味着您可以使用日期字符串(如’YYYY-MM-DD’)来选择整个日期范围内的所有行,即使这些行包含时间信息。这对于将一个列的值复制到另一个列的特定日期范围非常有用。

示例代码:

import pandas as pd# 重新创建包含时间部分的DataFramerng = pd.date_range('2000-03-19', periods=10, freq='9H')df = pd.DataFrame({'close': range(10)}, index=rng)print("原始DataFrame:")print(df)# 初始化 'event' 列为 NaNdf['event'] = float('nan')# 使用部分字符串索引将 'close' 列的值赋给 'event' 列的特定日期df.loc['2000-03-20', 'event'] = df['close']print("n使用部分字符串索引赋值后的DataFrame:")print(df)

输出示例:

原始DataFrame:                     close2000-03-19 00:00:00      02000-03-19 09:00:00      12000-03-19 18:00:00      22000-03-20 03:00:00      32000-03-20 12:00:00      42000-03-20 21:00:00      52000-03-21 06:00:00      62000-03-21 15:00:00      72000-03-22 00:00:00      82000-03-22 09:00:00      9使用部分字符串索引赋值后的DataFrame:                     close  event2000-03-19 00:00:00      0    NaN2000-03-19 09:00:00      1    NaN2000-03-19 18:00:00      2    NaN2000-03-20 03:00:00      3    3.02000-03-20 12:00:00      4    4.02000-03-20 21:00:00      5    5.02000-03-21 06:00:00      6    NaN2000-03-21 15:00:00      7    NaN2000-03-22 00:00:00      8    NaN2000-03-22 09:00:00      9    NaN

这种方法简洁高效,特别适用于将整个日期的数据批量复制到新列。

理解与避免低效的循环方法

原始问题中尝试使用iterrows()循环进行操作,但遇到了问题。理解其原因有助于避免类似的陷阱。

1. 原问题中的错误分析

原始代码片段如下:

for index, row in df.iterrows():    if index == '2000-03-20 00:00:00':        df['event'] = row['close'] # 错误:这里会覆盖整个 'event' 列    else:        df['event'] = float('nan') # 错误:这里同样会覆盖整个 'event' 列

问题在于 df[‘event’] = … 这种赋值方式会作用于整个列,而不是当前循环的行。每次循环迭代时,它都会尝试将 row[‘close’] 或 float(‘nan’) 赋给 df 的整个 ‘event’ 列。因此,最终结果将是最后一次迭代所赋的值,或者更常见的是,在循环结束时,所有行都被赋为NaN(因为最后一行通常不满足条件)。

2. 修正后的循环方法(不推荐)

如果非要使用循环,正确的做法是使用df.loc根据当前行的索引进行赋值:

import pandas as pd# 重新创建包含时间部分的DataFramerng = pd.date_range('2000-03-19', periods=10, freq='9H')df_loop_fixed = pd.DataFrame({'close': range(10)}, index=rng)# 初始化 'event' 列为 NaNdf_loop_fixed['event'] = float('nan')print("原始DataFrame:")print(df_loop_fixed)# 修正后的循环方法 (仅为演示,不推荐用于生产环境)for index, row in df_loop_fixed.iterrows():    # 匹配日期部分,忽略时间    if index.normalize() == pd.Timestamp('2000-03-20'):        df_loop_fixed.loc[index, 'event'] = row['close']    else:        df_loop_fixed.loc[index, 'event'] = float('nan')print("n修正后但低效的循环方法结果:")print(df_loop_fixed)

输出示例:

原始DataFrame:                     close  event2000-03-19 00:00:00      0    NaN2000-03-19 09:00:00      1    NaN2000-03-19 18:00:00      2    NaN2000-03-20 03:00:00      3    NaN2000-03-20 12:00:00      4    NaN2000-03-20 21:00:00      5    NaN2000-03-21 06:00:00      6    NaN2000-03-21 15:00:00      7    NaN2000-03-22 00:00:00      8    NaN2000-03-22 09:00:00      9    NaN修正后但低效的循环方法结果:                     close  event2000-03-19 00:00:00      0    NaN2000-03-19 09:00:00      1    NaN2000-03-19 18:00:00      2    NaN2000-03-20 03:00:00      3    3.02000-03-20 12:00:00      4    4.02000-03-20 21:00:00      5    5.02000-03-21 06:00:00      6    NaN2000-03-21 15:00:00      7    NaN2000-03-22 00:00:00      8    NaN2000-03-22 09:00:00      9    NaN

注意事项: 尽管上述修正后的循环代码可以得到正确结果,但强烈不推荐在Pandas中进行大规模数据操作时使用iterrows()或任何显式Python循环。iterrows()的性能非常差,因为它在每次迭代时都会将行转换为Series对象,这涉及到额外的开销。对于大多数操作,Pandas都提供了优化的矢量化函数,它们基于C语言实现,速度远快于Python循环。

总结与最佳实践

在Pandas中根据日期条件获取列值并填充NaN时,始终优先考虑矢量化解决方案。

对于根据日期(忽略时间)或精确时间戳进行条件筛选并赋值,推荐使用 Series.where()。 结合 df.index.normalize() 可以灵活处理时间序列数据。对于将特定日期范围内的值批量赋值到新列,df.loc 结合部分字符串索引是简洁高效的选择。避免使用 for … in df.iterrows(): 循环进行行级别的赋值操作。 尽管可以通过 df.loc[index, ‘column’] = value 修正其逻辑错误,但其性能低下,不适用于生产环境。

掌握这些高效的Pandas技巧,将使您在处理时间序列数据时更加得心应手,并编写出性能更优、更具可读性的代码。

以上就是Pandas 时间序列数据处理:按特定日期条件提取列值与填充NaN的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/918512.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月29日 06:33:25
下一篇 2025年11月29日 06:38:34

相关推荐

  • Ondo Finance将代币化证券服务扩展至BNB Chain

    近期,Ondo Finance 宣布将其代币化证券服务扩展至 BNB Chain,使投资者能够在该公链上更便捷地访问数字证券资产。此举有助于提升资产流动性,并为去中心化金融(DeFi)生态注入更多投资机会。 Ondo Finance 代币化证券服务简介 Ondo Finance 提供代币化证券解决方…

    好文分享 2025年12月9日
    000
  • Helius发布Solana区块链浏览器“Orb”,配备AI解释、交易热力图等功能

    近日,Helius 发布了针对 Solana 区块链的全新浏览器 Orb,该浏览器配备了 AI 交易解释、交易热力图等功能,旨在帮助用户更直观地理解链上数据和交易行为。这一工具将提升投资者对 Solana 网络交易和资金流向的可视化分析能力。 Orb 浏览器功能解析 Orb 浏览器的核心功能包括: …

    2025年12月9日
    000
  • X402能否成为继BTC、ETH后第三条主线?生态全面分析

    X402并非数字资产,而是指代一种新兴的AI智能体支付协议。其核心是通过标准化意图授权,使AI智能体能直接发起、接收和对账支付,Kite AI作为首批兼容该协议的Layer1区块链,正与Coinbase Ventures合作推动其大规模应用,被视为可能超越Ordinals铭文的财富效应新叙事。 X4…

    2025年12月9日
    000
  • 什么是加密货币空投?如何精准埋伏尚未发币的潜力项目

    加密货币空投是一种常见的营销策略,项目方会将免费的代币分发给潜在的用户,旨在提高项目的知名度和用户参与度。通过空投,新项目能够快速吸引社群关注,并激励早期支持者。对于投资者而言,空投提供了一个无需成本获取新资产的机会。 什么是加密货币空投? 1. 加密货币空投是指项目方将一定数量的加密货币免费分发给…

    2025年12月9日
    000
  • 币安binance官方登录入口 币安交易所安卓版下载安装

    为了帮助用户准确找到币安官方登录入口,并顺利完成安卓版app的下载与安装,本文将详细梳理官方渠道、核心功能及应用优势,助您轻松开启数字资产交易之旅。 币安官网入口: 币安官方APP下载: 平台核心功能与服务 币安作为全球领先的交易所,为用户提供了全面的数字资产服务。它提供全球范围内的数字资产交易服务…

    2025年12月9日
    000
  • 币安官网官方认证首页地址入口 币安交易平台APP下载安装指南

    为了帮助用户准确找到%ignore_a_1%(binance)官网的官方认证首页入口,并顺利完成交易平台app的下载与安装,本文将提供一份详尽的指南。我们将为您提供官方渠道的直接访问地址,并解析平台的核心功能与app的使用优势,助您轻松开启web3交易之旅。 币安官网入口: 币安官方APP下载: 币…

    2025年12月9日
    000
  • Cardano 集成 x402 协议是什么?如何运作?ADA 价格分析、未来蓝图介绍

    cardano 推出 x402 支付标准,让 ai 代理能自主以 ada 与 usdm 进行链上支付,推动 ai 经济与 defi 生态的全面升级。 Binance币安 欧易OKX ️ Huobi火币️ 什么是 Cardano 的 x402 支付标准 x402 支付标准标志着区块链支付方式的一次根本…

    2025年12月9日
    000
  • 币安官方认证入口 币安交易所手机版v3.9.0下载

    如何找到币安(binance)官方认证的app入口并下载最新的手机版v3.9.0?这是许多web3用户关心的问题。本文将为您详细介绍币安交易所的官方下载渠道、核心功能以及其在web3世界中的独特价值。 币安官网入口: 币安官方APP v3.9.0下载: 币安App核心功能解析 币安App不仅仅是一个…

    2025年12月9日
    000
  • 币安App官网入口 币安交易所安卓APP最新版下载

    许多用户正在寻找币安app的官网入口以及安卓最新版的下载渠道。本文将为您提供币安交易所的官方入口地址和app使用详情,帮助您安全、便捷地开始您的数字资产之旅。 币安官网入口: 币安官方APP v3.6.0下载: 平台核心功能与服务 币安平台提供全球范围内的数字资产交易服务,全面涵盖主流与新兴代币的现…

    2025年12月9日
    000
  • AAVE是什么?一文读懂去中心化借贷协议AAVE的运作模式

    想了解aave吗?它可不仅仅是一个金融术语。aave是一个领先的去中心化借贷协议,它改变了我们对借贷的传统认知。通过区块链技术,aave让用户可以在没有银行等中介的情况下进行加密资产的存入和借出,实现了真正的点对点金融。这种模式为全球用户提供了前所未有的金融自由和效率。 AAVE的核心功能与优势 1…

    2025年12月9日
    000
  • 币安Android客户端下载 币安交易所官方入口网址

    作为通往web3世界的重要门户,币安交易所提供了强大而全面的服务。本文将深入解析币安的核心功能、移动端优势及其不断扩展的web3生态布局,并为您提供官方认证的访问途径,助您开启数字资产探索之旅。 币安Web3交易所官方入口: 币安官方移动客户端下载: 探索币安的核心交易与金融服务 平台提供覆盖全球的…

    2025年12月9日
    000
  • 币安App官方下载通道 币安交易所最新版v3.7.0 安卓版

    币安app官方下载通道在哪里?这是不少网友都关注的,接下来由php小编为大家带来币安交易所最新版v3.7.0安卓版的相关信息,感兴趣的网友一起随小编来瞧瞧吧! 币安App官方最新版v3.7.0 安卓版下载: 币安交易所官网入口: 1、提供多种数字资产之间的交易服务,涵盖主流与新兴项目,满足不同用户的…

    2025年12月9日
    000
  • Pyth Network(PYTH)是什么?预言机新星PYTH如何挑战Chainlink

    pyth network (pyth) 是预言机领域冉冉升起的新星,致力于为去中心化金融(defi)应用提供高质量、低延迟的金融市场数据。它通过独特的“发布者-订阅者”模型,汇集了众多顶级交易公司和交易所的数据,力求在精准性和速度上超越现有解决方案,向市场霸主chainlink发起挑战。 PYTH …

    2025年12月9日
    000
  • 什么是ZK-Rollup?zkSync和Starknet的技术路径有何不同

    zk-rollup是一种创新的二层扩容方案,它通过将大量交易批量处理并在链下计算,然后将这些交易的零知识证明提交到主链,从而极大地提升了以太坊网络的吞吐量和效率。这种技术能够确保交易的完整性和安全性,同时显著降低了交易费用,是当前解决区块链可扩展性挑战的重要方向之一。 ZK-Rollup的核心原理 …

    2025年12月9日
    000
  • 如何注册苹果手机海外apple ID?IOS用户注册台湾Apple ID操作教程

    苹果手机因为国区的限制,所以我们要注册一个中国台湾的apple id,才能够去下载币安、欧易等应用app。美国和香港的apple id现在也都不行了。美区的apple id里面只能够下载到 阉 割 版 本 的币安,香港也因为监管的原因,这些交易所的app也都有可能,被要求从appstore下架。所以…

    2025年12月9日 好文分享
    000
  • 什么是全链游戏(On-chain Game)?它和传统链游有何区别

    全链游戏(on-chain game),顾名思义,是指将游戏的核心逻辑、状态和资产全部部署在区块链上的游戏。与传统链游不同,全链游戏真正实现了去中心化,消除了对中心化服务器的依赖,为玩家带来更深层次的拥有权和透明度。 全链游戏的定义与特点 1. 全链游戏的核心在于其去中心化的架构。这意味着游戏的所有…

    2025年12月9日
    000
  • 币安安卓下载官方 币安App最新v3.7.0版本

    币安安卓下载官方入口在哪里?这是不少网友都关注的,接下来由php小编为大家带来币安app最新v3.7.0版本下载地址,感兴趣的网友一起随小编来瞧瞧吧! 币安官方App最新v3.7.0下载: 币安官网入口: 平台基础信息 1、该平台为全球范围内活跃的数字资产交易应用,支持超过三百种不同类型的加密货币进…

    2025年12月9日
    000
  • 什么是Unibase(UB)币?UB工作原理、代币经济学及购买方法

    随着人工智能 (ai) 和区块链技术的融合,支持使用分布式内存运行的自主 ai 代理的底层基础设施的重要性日益凸显。unibase (ub) 正是为满足这些新的技术需求而涌现的解决方案。 Binance币安 欧易OKX ️ Huobi火币️ Unibase (UB) 是一个去中心化的 AI 记忆层,…

    2025年12月9日 好文分享
    000
  • RWA是什么意思?RWA赛道有哪些币种?一文了解币圈

    rwa(真实世界资产)赛道旨在将现实世界中的资产通过区块链技术进行代币化,从而打通传统金融与加密世界的桥梁。本文将为您详细解读rwa的含义,并介绍该赛道中值得关注的几个核心币种。 一、RWA是什么意思? 1、RWA的全称是Real World Assets,中文译为“真实世界资产”。 2、其核心概念…

    2025年12月9日
    000
  • 欧易OKX App v6.145.0 官方版下载 欧易最新安装入口

    欧易okx app v6.145.0 官方版在哪里下载?这是不少网友都关注的,接下来由php小编为大家带来欧易okx app官方版入口地址,感兴趣的网友一起随小编来瞧瞧吧! 欧易OKX App v6.145.0 官方版下载: 欧易OKX官网入口: 1、支持全球主流及新兴数字货币的现货交易,用户可以进…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信