问题1衍生出来的,有一个字段‘update_time’,从小到大排序,10分钟为一个mark。
之前的做法是,先求得最大时间和最小时间之间有多少个10分钟,以十分钟十分钟的存入一个list,外层遍历‘update_time’,内层用每个time去list里面比较,取出索引值,具体如下:
df = df.sort_values('update_time', ascending=True) # 时间升序
min = (df['update_time'].min())
max = (((df['update_time'].max()) - (df['update_time'].min())) / 600).astype(int) # 多少个十分钟
'''时间间隔 1 '''
gap = []
gap.append(min)
# gap=[gap[i] + 600 for i in range(0, max + 1)]
# print(1,gap)
for i in range(0, max + 1):
target = gap[i] + 600
gap.append(target)
df['mark'] = 1
k = 0
for m in df['update_time']:
for n in gap[k:]:
if m >= n:
continue
else:
a = df[df['update_time'] == m]['mark'].index
df['mark'][a] = gap.index(n)
k = gap.index(n) # 下一轮从当前位置开始遍历gap[k:]
break
然后,同事用一个月的数据量去跑,一晚上没跑出来,我的天.....
然后,逼得他改了方式,用python自带的字典dict,15分钟就出来了,哈哈哈
gap = []
gap.append(min)
for i in range(0, max + 1):
target = gap[i] + 600
gap.append(target)
dic={}
dic2={}
for i in range(len(gap)-1):
dic[(gap[i],gap[i+1])]=i+1
dic2[(gap[i]+150,gap[i+1]+150)]=i+1
def f(x,dic):
for k,v in dic.items():
if k[0]<=x and x<=k[1]:
return v
就去了解了一下, python dict是一个哈希函数,其最坏的情况是O(n)。应该看一下数据结构。