pandas对时间进行排序 pandas按日期排序

本文详细介绍了在pandas dataframe中根据特定日期或日期时间条件提取列值,将不符合条件的行填充为nan的多种高效符串索引进行批量操作。同时,文章也分析了传统`iterro ws`循环的性能问题及正确的使用方式,强调在处理列数据时应优先采用向量化操作以提升效率和代码竞争力。
在数据分析中,我们经常需要根据DataFrame的日期或时间索引来筛选或修改数据。例如,我们可能在特定的一个日期提取某个列需要的值,而其他日期则高效则填充为 NaN。虽然初学者可能会倾向于使用循环来解决此类问题,但 Pandas 提供了更多但一些方法。的矢量化解决方案
Pan das 的矢量化操作能够显着提高数据处理的效率,尤1。 使用Series.where()进行日期条件筛选
Series.where() True时,保留原False时,替换为指定值(默认为NaN)。
如果DataFra me的索引是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(quot;原始DataFrame:quot;)print(df)#使用Series.where(),并忽略时间部分进行日期匹配# df.index.normalize() Timestamp('2000-03-20') = df['close'].where(df.index.normalize() == pd.Timestamp('2000-03-20'))print(quot;\n使用 df.index.normalize() 和Series.where()后的DataFrame:quot;)print(df)登录后复制
输出示例:序列猴子开放平台
具有长序列、多模态、单模型、大数据等特点的超大规模语言模型0 查看详情 原始数据帧: 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:关闭事件2000-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',周期=10)df_daily = pd.DataFrame({'close':range(10)},index=rng_daily)print(quot;\n原始DataFrame(每日数据):quot;)print(df_daily)#精确匹配特定日期df_daily['event'] = df_daily['close'].where(df_daily.index == '2000-03-20')print(quot;\n使用Series.where() DataFrame:quot;)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:关闭事件2000-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 image etimeIndex支持部分字符串索引,这意味着您可以使用日期字符串(如'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(quot;原始DataFrame:quot;)print(df)#初始化 'event' 一些NaNdf['event'] = float('nan')#使用部分字符串索引将 'close' 列的值赋给 'event' 列的特定日期df.loc['2000-03-20', 'event'] = df['close']print(quot;\n使用部分字符串索引指定后的DataFram e:quot;)print(df)登录后复制
输出结果:原始DataFrame:关闭2000-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:关闭事件2000-03-19 00:00:00 0 南2000-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.itrows(): 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.后面的循环方法(不推荐修改)
如果非要使用循环,正确图片: import: import pandas as pd# pd.DataFrame({'close': range(10)},index=rng)# 初始化 'event' 即 NaNdf_loop_fixed['event'] = float('nan')print(quot;原始DataFrame:quot;)print(df_loop_fixed)# #匹配日期部分,忽略时间 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(quot;\n修改后但效率低的循环方法结果:quot;)pr int(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南2000-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南2000-03-22 09:00:00
9 NaN登录后复制
注意事项:Pand作为中进行大规模数据操作时使用iterrows()或任何显式Pyt hon循环。iterrows()的性能非常差,因为在每次迭代时都会将行转换为Series对象,这涉及到额外的开销。对于大多数操作,Pandas都提供了优化的矢量化函数,它们基于C语言实现,速度远快于Python循环。总结与最佳实践
在Pandas化解决方案中。对于根据日期(忽略时间)或准确时间进行条件排序并赋值,推荐使用Series.where()。结合使用Series.where()。 df.index.normalize() www.df.loc结合部分字符串高效索引是简洁的选择。避免使用... in df.itrows():df.loc[index, 'column'] = value
掌握这些Pandas技巧,让你在处理时间序列数据时更加得心应手,并编写出性能更优、刚性性的代码。
以上就是Pandas 时间序列数据处理:按特定日期条件提取列值与填充高效的详细内容,更多请关注乐哥常识网其他相关文章!相关标签语言: python c ai 代码区别性 yy Python c 语言 pandas Float for 字符串循环 事件对象列数据分析 Python Shell Python Shell Python Shell Python 脚本:替换 HTML 标签内反斜杠为正斜杠 Python 中自定义二进制到数据转换时间教程 Python 列表与灵活初始化方法
