我是个初学者,做了一个基本的嵌套for循环,以修改现有的每小时数据系列。该系列由熊猫制成,具有日期时间索引和值。
我的代码基本上比较两个系列(A和B)的年,月和日索引,如果它们在某些行上相同,则更改series(A)的值并制作一个修改后的系列。
它适用于短数据,但是效率很差。 当我运行10,000个计数数据时,循环永远不会结束。 系列A大约有10,000个计数,系列B大约有1,000个计数。
我已经在简化嵌套循环方面搜索了类似问题几天,但是我无法处理如何处理索引比较部分,而且我希望修改后的A系列的对象类型和索引保持不变。哪怕是一个小技巧也对我很有帮助。
for i in range(0,len(A)):
for j in range(0,len(B)):
if A.index.year[i] == B.index.year[j] and A.index.month[i] == B.index.month[j] and A.index.day[i] == B.index.day[j]:
A.values[i] = B.values[j]
break
else:
pass
答案 0 :(得分:1)
可以使您受益的一件事是Short Circuiting。基本上,如果您的数据集方便的话,您可以使长条件语句更快地识别错误结果。我不知道您要比较的日期看起来像什么,但请考虑以下示例:
日期1:2019年1月1日
日期2:2019年1月2日
您的条件语句经过3次比较,最终确定两个日期不相等。
2019 == 2019
一月==一月
1!= 2
如果要将条件更改为:
A.index.day[i] == B.index.day[j] and A.index.month[i] == B.index.month[j] and A.index.year[i] == B.index.year[j]
您的程序将首先比较这两天,并确定它们不相等。并且由于您的条件由布尔AND运算组成,因此短路逻辑得出的结论是总体条件必须为假。
通过这种方式,只需要进行一次比较,而不需要进行三次。但是,从这种方法中获得任何显着的改进取决于您的约会日期。如果您的约会都在同一年或同一年,那么我提到的方法肯定可以提高您的表现。但是,如果您的集合包含广泛分布的月,日和年,则可能不会引起明显的变化。
本质上,请考虑平均情况下,您的哪种情况最有可能返回False。在条件语句中首先评估该条件。
希望这会有所帮助!