首页 > 解决方案 > 通过每小时对年度数据执行一些操作来裁剪数据的最佳 Pythonic 方式

问题描述

我有一天的数据,如下所示:

df =

在此处输入图像描述

我的输出应该是这样的:

在此处输入图像描述

我需要做两个主要操作:

a) 制定千年发展目标:

  1. 对于每一天,我都会找到: abs(GHI_clearsky-GHI) 并将其保存到 pandas 系列对象
  2. 然后我按降序对这个系列进行排序。
  3. 在 df['top3_MDGS'] 我保存该系列的最高 3 个值的总和
  4. 在 df['top1_MDGS'] 我保存系列的最大值

b) 过滤:

  1. 对于每一天,我按小时计算,只选择小时数据中具有 60 个读数且 df['GHI'] 值非零的分钟
  2. 如果它通过上述条件,我只保存这些结果以供进一步分析,否则将被丢弃。

我使用的代码如下所示:

def zenith_clipping_MDGS(df):
    data_file = df
    df_zenith_clipped = data_file[data_file.zenith<=86.273]
    df_zenith_clipped.reset_index(drop = True, inplace = True)
    df_zenith_clipped['Hour'] = df_zenith_clipped['Datetime'].dt.hour
    df_zenith_clipped['Date'] = df_zenith_clipped['Datetime'].dt.date
    adj_df = pd.DataFrame()
    for date in df_zenith_clipped.Date.unique():
        print(date)
        df = df_zenith_clipped[df_zenith_clipped.Date == date]
        MDGS = abs(df.GHI_clearsky - df.GHI)
        MDGS = MDGS.sort_values(ascending = False)
        MDGS.reset_index(inplace = True, drop=True)
        df['top3_MDGS'] = sum(MDGS[:3])
        df['top1_MDGS'] = MDGS[0]

        for hour in df.Hour.unique():
            df1 = df[df.Hour == hour]
            if (len(df1) == 60) and (df1.GHI.any() != 0):
                adj_df = adj_df.append(df1)
            else:
                continue
    adj_df.reset_index(inplace = True, drop=True)
    
    return adj_df

这实际上比它应该花费的时间更多。是否有一些功能,或者更好的方法来解决这个问题?

谢谢,感谢任何反馈

标签: pythonpandasnumpy

解决方案


一些可以优化的东西......

a) 如果您只需要序列中的前 3 个值,则对这些值的整个列表进行排序可能不是很有效,因为额外的操作将花费在冗余排序上。这个问题的答案讨论了一些更有效的方法(例如,使用max()查找最大值,将其从列表中删除,并重复 3 次)。

b)虽然我并不完全熟悉您正在使用的数据/框架,但看起来您可能能够优化小时查找 - 特别是对于df1 = df[df.Hour == hour],似乎==需要遍历所有内容df.Hour才能找到唯一匹配的元素。如果可以将其重写为使用数字索引而无需搜索,它可能会执行得更快。


推荐阅读