【问题标题】:PANDAS - Loop over two datetime indexes with different sizes to compare days and valuesPANDAS - 循环两个不同大小的日期时间索引以比较日期和值
【发布时间】:2017-09-02 02:21:57
【问题描述】:

寻找一种更有效的方法来循环和比较两个具有不同频率的 Series 对象中的 datetimeindex 值。

设置

想象一下两个 Pandas 系列,每个系列都有一个涵盖同一年份跨度的日期时间索引,但每个索引的频率不同。一个有几天的频率,另一个有几个小时的频率。

range1 = pd.date_range('2016-01-01','2016-12-31', freq='D')
range2 = pd.date_range('2016-01-01','2016-12-31', freq='H')

我正在尝试循环使用这些系列的索引作为查找以匹配日期,以便我可以比较每天的数据。

我现在在做什么……慢。

现在我正在使用多级 for 循环和 if 语句(见下文);与我在 Pandas 操作中习惯的时间相比,完成这些循环的时间似乎过多(每个循环 5.45 秒)。

for date, val in zip(frame1.index, frame1['data']): # freq = 'D'
    for date2, val2 in zip(frame2.index, frame2['data']): # freq = 'H'
        if date.day == date2.day: # check to see if dates are a match
            if val2 > val: # compare the values
                # append values, etc

问题

是否有更有效的方法使用 frame1 中的索引来循环 frame2 中的索引并比较给定日期每一帧中的值?最终,我想在 frame2 vals 大于 frame1 vals 的地方创建一系列值。

可重现(测试)示例

使用随机数据创建两个单独的系列,并为每个系列分配一个日期时间索引。

import pandas as pd
import numpy as np

range1 = pd.date_range('2016-01-01','2016-12-31', freq='D')
range2 = pd.date_range('2016-01-01','2016-12-31', freq='H')

frame1 = pd.Series(np.random.rand(366), index=range1)
frame2 = pd.Series(np.random.rand(8761), index=range2)

【问题讨论】:

    标签: python pandas comparison datetimeindex time-frequency


    【解决方案1】:

    仍然不确定您要如何处理这些信息。但我会这样做:

    • 复制frame2
    • 将其索引拆分为日期和时间组件
    • 比较指定级别

    frame3 = frame2.copy()
    frame3.index = [pd.to_datetime(frame3.index.date), frame.index.time]
    results = frame3.lt(frame1, level=0)
    
    results.head()
    
    2016-01-01  00:00:00    True
                01:00:00    True
                02:00:00    True
                03:00:00    True
                04:00:00    True
    dtype: bool
    

    【讨论】:

      【解决方案2】:

      是的,使用resampleasfreqpd.concat

      使用重新采样从您的系列中获取正确的频率。

      asfreq(听起来有点脏)用于转换回具有在 resample 中定义的频率的序列。

      与 frame1 连接以并排获取值。

      df = pd.concat([frame1,frame2.resample('1D').asfreq()],axis=1)
      df.head()
      

      输出:

                         0         1
      2016-01-01  0.147067  0.235858
      2016-01-02  0.820398  0.353275
      2016-01-03  0.840499  0.186273
      2016-01-04  0.505740  0.340201
      2016-01-05  0.547840  0.695041
      

      然后,您可以通过以下方式回到您的frame2超过frame1的系列。

      df.columns = ['frame1','frame2']
      df.query('framed1 < frame2')['frame2']
      

      【讨论】:

        猜你喜欢
        • 2021-01-19
        • 1970-01-01
        • 2016-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-20
        • 2020-03-11
        • 2021-07-13
        相关资源
        最近更新 更多