python - 通过每小时对年度数据执行一些操作来裁剪数据的最佳 Pythonic 方式
问题描述
我有一天的数据,如下所示:
df =
我的输出应该是这样的:
我需要做两个主要操作:
a) 制定千年发展目标:
- 对于每一天,我都会找到: abs(GHI_clearsky-GHI) 并将其保存到 pandas 系列对象
- 然后我按降序对这个系列进行排序。
- 在 df['top3_MDGS'] 我保存该系列的最高 3 个值的总和
- 在 df['top1_MDGS'] 我保存系列的最大值
b) 过滤:
- 对于每一天,我按小时计算,只选择小时数据中具有 60 个读数且 df['GHI'] 值非零的分钟
- 如果它通过上述条件,我只保存这些结果以供进一步分析,否则将被丢弃。
我使用的代码如下所示:
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
这实际上比它应该花费的时间更多。是否有一些功能,或者更好的方法来解决这个问题?
谢谢,感谢任何反馈
解决方案
一些可以优化的东西......
a) 如果您只需要序列中的前 3 个值,则对这些值的整个列表进行排序可能不是很有效,因为额外的操作将花费在冗余排序上。这个问题的答案讨论了一些更有效的方法(例如,使用max()
查找最大值,将其从列表中删除,并重复 3 次)。
b)虽然我并不完全熟悉您正在使用的数据/框架,但看起来您可能能够优化小时查找 - 特别是对于df1 = df[df.Hour == hour]
,似乎==
需要遍历所有内容df.Hour
才能找到唯一匹配的元素。如果可以将其重写为使用数字索引而无需搜索,它可能会执行得更快。
推荐阅读
- arrays - 如何使用数组反转技术旋转数组?
- javascript - 将鼠标悬停在名称上以更改香草 JS 中的颜色
- kubernetes - 关于在kubernetes(k8s)平台上运行pod的问题:pods are running but the containers are not-ready
- git - 为什么我的分支和开发之间的所有差异都没有显示在 PR 中?
- mongodb - 用于 json 类型值的 Mongodb Liqbase 脚本 findOneAndUpdate
- javascript - 让图像飞出屏幕
- python - 绕过多个 url 时更改 url 后缀的反爬虫
- javascript - 在 javascript 中重命名和更改属性/值的最有效方法
- javascript - Node.js:如何在 AWS Lambda 中进行错误处理?
- android - 无法将editText输入从字符串更改为浮点数