【问题标题】:Iterating over NumPy array for timestep迭代 NumPy 数组以获取时间步长
【发布时间】:2021-11-18 23:43:43
【问题描述】:

我在一个数组中有 5 列是 DateTime 类型的值。每列有 100k+ 个值

这些值是从 2015 年 1 月 15 日 00:30 到 2020 年 12 月 31 日 23:00 以 30 分钟为增量的时间线的 DateTime。

基本上,我想要做的是遍历数组中的值,并检查当前值是否与最后一个值相差 30 分钟的时间步长。在具有列的数组中,这将是当前正在调查的值之上的值

可能有几种方法可以做到这一点,但我提供了一个伪代码示例来说明我的想法


for row in _the_whole_array :
        for cell in row:
            if cell == to the 30 minute timestep of the cell above it
              continue iterating
            else:
              store that value
return the smallest timestep found, and the biggest timestep found 

我查看了 for 循环以及 nditer,但在迭代日期时间时遇到错误,我还想知道如何找到高于当前单元格值的单元格值。

非常感谢任何帮助

【问题讨论】:

    标签: python numpy numpy-ndarray array-broadcasting


    【解决方案1】:

    即使您在伪代码中使用行,我也不确定您的轴。但总体思路是一样的:如果您的 dtype 是 datetime,您可以对其进行基本算术运算

    x, y = _the_whole_array.shape
    for row in range(x):
        diff=_the_whole_array[row][1:]-_the_whole_array[row][:-1]
        print(np.amin(diff), np.amax(diff))
        
    for column in range(y):
        diff=_the_whole_array[:,column][1:]-_the_whole_array[:,column][:-1]
        print(np.amin(diff), np.amax(diff))
    

    【讨论】:

      【解决方案2】:

      正如@Heidiki 所提到的,考虑使用pandas,因为它会更容易处理大数据。

      为了解决您的问题,您可以创建一个临时变量来存储循环时上一行的值。在每次迭代中,您都会计算差异并检查绝对最小值和最大值,就像您的伪代码一样。

      这是一个示例和测试数据,3x5 矩阵。请检查输出是否符合您的要求。

      from datetime import datetime, timedelta
      import pandas as pd
      import numpy as np
      
      # test data
      arr = np.array([
          [datetime(2019, 1, 2, 13, 12), datetime(2019, 1, 2, 15, 19),
           datetime(2019, 1, 2, 15, 59), datetime(2019, 1, 2, 17, 23),
           datetime(2019, 1, 2, 15, 18)],
          [datetime(2019, 1, 2, 13, 34), datetime(2019, 1, 2, 15, 57),
           datetime(2019, 1, 2, 18, 53), datetime(2019, 1, 2, 17, 34),
           datetime(2019, 1, 2, 15, 29)],
          [datetime(2019, 1, 2, 13, 49), datetime(2019, 1, 2, 16, 35),
           datetime(2019, 1, 2, 21, 18), datetime(2019, 1, 2, 17, 59),
           datetime(2019, 1, 2, 15, 46)]
      ])
      
      
      def timedelta_to_minutes(dt: timedelta) -> int:
          return (dt.days * 24 * 60) + (dt.seconds // 60)
      
      
      def min_max_timestep(data: np.array) -> tuple:
          prev_row = min_step = max_step = None
          df = pd.DataFrame(data)
          for idx, row in df.iterrows():
              if not idx:
                  prev_row = row
                  continue
      
              diff = row - prev_row
              min_diff, max_diff = min(diff), max(diff)
              if min_step is None or min_diff < min_step:
                  min_step = min_diff
      
              if max_step is None or max_diff > max_step:
                  max_step = max_diff
      
              prev_row = row
      
          # convert timedelta to minutes
          return timedelta_to_minutes(min_step), timedelta_to_minutes(max_step)
      
      
      result = min_max_timestep(arr)
      

      【讨论】:

        【解决方案3】:

        尝试将您的 npArray 转换为 pandas 数据帧,因为它允许您对其行进行迭代,这里有一个代码 sn-p 可以帮助您。

        import pandas
        import numpy 
        
        # Creating Dataframe From NumPy Array
        df = pd.DataFrame(yout_array)
        
        #iterating through the dataframe
        for index, row in df.iterrows():
        
            # print current row
            print(row)
        
            # print previous row
            print(df[index -1]) if index != 0 else print('no previous row')
        

        【讨论】:

          猜你喜欢
          • 2016-08-20
          • 2017-02-26
          相关资源
          最近更新 更多