我正在使用yelp数据集来获取多个企业开放的时间。时间范围被放在一个列表中,列表中充满了每个公司的字典,如下所示。
{'Monday': '0:0-0:0', 'Tuesday': '8:0-18:30', 'Wednesday': '8:0-18:30', 'Thursday': '8:0-18:30', 'Friday': '8:0-18:30', 'Saturday': '8:0-14:0'}
{'Monday': '8:0-22:0', 'Tuesday': '8:0-22:0', 'Wednesday': '8:0-22:0', 'Thursday': '8:0-22:0', 'Friday': '8:0-23:0', 'Saturday': '8:0-23:0', 'Sunday': '8:0-22:0'}
{'Monday': '7:0-20:0', 'Tuesday': '7:0-20:0', 'Wednesday': '7:0-20:0', 'Thursday': '7:0-20:0', 'Friday': '7:0-21:0', 'Saturday': '7:0-21:0', 'Sunday': '7:0-21:0'}
{'Wednesday': '14:0-22:0', 'Thursday': '16:0-22:0', 'Friday': '12:0-22:0', 'Saturday': '12:0-22:0', 'Sunday': '12:0-18:0'}
{'Monday': '0:0-0:0', 'Tuesday': '6:0-22:0', 'Wednesday': '6:0-22:0', 'Thursday': '6:0-22:0', 'Friday': '9:0-0:0', 'Saturday': '9:0-22:0', 'Sunday': '8:0-22:0'}
{'Monday': '0:0-0:0', 'Tuesday': '10:0-18:0', 'Wednesday': '10:0-18:0', 'Thursday': '10:0-18:0', 'Friday': '10:0-18:0', 'Saturday': '10:0-18:0', 'Sunday': '12:0-18:0'}
{'Monday': '9:0-17:0', 'Tuesday': '9:0-17:0', 'Wednesday': '9:0-17:0', 'Thursday': '9:0-17:0', 'Friday': '9:0-17:0'}
None
{'Monday': '0:0-0:0', 'Tuesday': '6:0-21:0', 'Wednesday': '6:0-21:0', 'Thursday': '6:0-16:0', 'Friday': '6:0-16:0', 'Saturday': '6:0-17:0', 'Sunday': '6:0-21:0'}
150,000个元素。
可以看到,一个元素没有任何信息,并且显示为"None"代替。我使用dropna()命令来清除这些。然而,它在列表中留下了一个空白,并扰乱了我计算小时数的for循环。
下面是一个小例子来解释我的意思。
表开始如下
index,0
0,0.0
1,1.0
2,3.0
3,NaN
4,4.0
5,5.0.
和更改为
index,0
0,0.0
1,1.0
2,3.0
4,4.0
5,5.0
使用dropna()后
可以看到,表从2跳到4。
在我的for循环中,我让它计算一个范围(1-150000)内每周的总时间,但由于没有第8行和其他行,它抛出一个错误并停止循环。
所以…我的问题是,我如何运行我的for循环,使它跳过这些不存在的行。
还有,这是我的代码:
df_new = df_hours.dropna()
for i in range(1,150000):
dc = df_new[i]
print(dc)
sum_elapsed = 0
for _, v in dc.items():
start, end = v.split('-')
hhs, mms = (int(v) for v in start.split(':'))
hhe, mme = (int(v) for v in end.split(':'))
elapsed = (hhe * 60 + mme) - (hhs * 60 + mms)
sum_elapsed += elapsed
print(sum_elapsed)
给定一个字典列表:
data = [{'Monday': '0:0-0:0', 'Tuesday': '8:0-18:30', 'Wednesday': '8:0-18:30', 'Thursday': '8:0-18:30', 'Friday': '8:0-18:30', 'Saturday': '8:0-14:0'},
{'Monday': '8:0-22:0', 'Tuesday': '8:0-22:0', 'Wednesday': '8:0-22:0', 'Thursday': '8:0-22:0', 'Friday': '8:0-23:0', 'Saturday': '8:0-23:0', 'Sunday': '8:0-22:0'},
{'Monday': '7:0-20:0', 'Tuesday': '7:0-20:0', 'Wednesday': '7:0-20:0', 'Thursday': '7:0-20:0', 'Friday': '7:0-21:0', 'Saturday': '7:0-21:0', 'Sunday': '7:0-21:0'},
{'Wednesday': '14:0-22:0', 'Thursday': '16:0-22:0', 'Friday': '12:0-22:0', 'Saturday': '12:0-22:0', 'Sunday': '12:0-18:0'},
{'Monday': '0:0-0:0', 'Tuesday': '6:0-22:0', 'Wednesday': '6:0-22:0', 'Thursday': '6:0-22:0', 'Friday': '9:0-0:0', 'Saturday': '9:0-22:0', 'Sunday': '8:0-22:0'},
{'Monday': '0:0-0:0', 'Tuesday': '10:0-18:0', 'Wednesday': '10:0-18:0', 'Thursday': '10:0-18:0', 'Friday': '10:0-18:0', 'Saturday': '10:0-18:0', 'Sunday': '12:0-18:0'},
{'Monday': '9:0-17:0', 'Tuesday': '9:0-17:0', 'Wednesday': '9:0-17:0', 'Thursday': '9:0-17:0', 'Friday': '9:0-17:0'},
None,
{'Monday': '0:0-0:0', 'Tuesday': '6:0-21:0', 'Wednesday': '6:0-21:0', 'Thursday': '6:0-16:0', 'Friday': '6:0-16:0', 'Saturday': '6:0-17:0', 'Sunday': '6:0-21:0'}]
做:
df = pd.json_normalize(data)
print(df)
输出:
Monday Tuesday Wednesday Thursday Friday Saturday Sunday
0 0:0-0:0 8:0-18:30 8:0-18:30 8:0-18:30 8:0-18:30 8:0-14:0 NaN
1 8:0-22:0 8:0-22:0 8:0-22:0 8:0-22:0 8:0-23:0 8:0-23:0 8:0-22:0
2 7:0-20:0 7:0-20:0 7:0-20:0 7:0-20:0 7:0-21:0 7:0-21:0 7:0-21:0
3 NaN NaN 14:0-22:0 16:0-22:0 12:0-22:0 12:0-22:0 12:0-18:0
4 0:0-0:0 6:0-22:0 6:0-22:0 6:0-22:0 9:0-0:0 9:0-22:0 8:0-22:0
5 0:0-0:0 10:0-18:0 10:0-18:0 10:0-18:0 10:0-18:0 10:0-18:0 12:0-18:0
6 9:0-17:0 9:0-17:0 9:0-17:0 9:0-17:0 9:0-17:0 NaN NaN
7 NaN NaN NaN NaN NaN NaN NaN
8 0:0-0:0 6:0-21:0 6:0-21:0 6:0-16:0 6:0-16:0 6:0-17:0 6:0-21:0
删除NaN行,并重置索引:
df = df.dropna(how='all').reset_index(drop=True)
print(df)
输出:
Monday Tuesday Wednesday Thursday Friday Saturday Sunday
0 0:0-0:0 8:0-18:30 8:0-18:30 8:0-18:30 8:0-18:30 8:0-14:0 NaN
1 8:0-22:0 8:0-22:0 8:0-22:0 8:0-22:0 8:0-23:0 8:0-23:0 8:0-22:0
2 7:0-20:0 7:0-20:0 7:0-20:0 7:0-20:0 7:0-21:0 7:0-21:0 7:0-21:0
3 NaN NaN 14:0-22:0 16:0-22:0 12:0-22:0 12:0-22:0 12:0-18:0
4 0:0-0:0 6:0-22:0 6:0-22:0 6:0-22:0 9:0-0:0 9:0-22:0 8:0-22:0
5 0:0-0:0 10:0-18:0 10:0-18:0 10:0-18:0 10:0-18:0 10:0-18:0 12:0-18:0
6 9:0-17:0 9:0-17:0 9:0-17:0 9:0-17:0 9:0-17:0 NaN NaN
7 0:0-0:0 6:0-21:0 6:0-21:0 6:0-16:0 6:0-16:0 6:0-17:0 6:0-21:0
做你的功能正确:
def myFunc(v):
if isinstance(v, str):
start, end = v.split('-')
hhs, mms = (int(v) for v in start.split(':'))
hhe, mme = (int(v) for v in end.split(':'))
return (hhe * 60 + mme) - (hhs * 60 + mms)
else:
return v
df = df.applymap(myFunc)
输出:
Monday Tuesday Wednesday Thursday Friday Saturday Sunday
0 0.0 630.0 630.0 630.0 630.0 360.0 NaN
1 840.0 840.0 840.0 840.0 900.0 900.0 840.0
2 780.0 780.0 780.0 780.0 840.0 840.0 840.0
3 NaN NaN 480.0 360.0 600.0 600.0 360.0
4 0.0 960.0 960.0 960.0 -540.0 780.0 840.0
5 0.0 480.0 480.0 480.0 480.0 480.0 360.0
6 480.0 480.0 480.0 480.0 480.0 NaN NaN
7 NaN NaN NaN NaN NaN NaN NaN
8 0.0 900.0 900.0 600.0 600.0 660.0 900.0
总额:
>>> df.sum().sum()
30600.0
矢量化(ish),并使用timedelta而不是重新发明轮子:
for col in df:
x = df[col].str.extract('(d*):(d*)-(d*):(d*)').astype(float)
h = x.loc[:, ::2].apply(pd.to_timedelta, unit='h')
m = x.loc[:, 1::2].apply(pd.to_timedelta, unit='m')
x = h + m.values
df[col] = x[2] - x[0]
>>> df.sum().sum()
Timedelta('21 days 06:00:00')
>>> df.sum().sum().total_seconds() // 60
30600.0
>>> df
Monday Tuesday Wednesday Thursday Friday Saturday Sunday
0 0 days 00:00:00 0 days 10:30:00 0 days 10:30:00 0 days 10:30:00 0 days 10:30:00 0 days 06:00:00 NaT
1 0 days 14:00:00 0 days 14:00:00 0 days 14:00:00 0 days 14:00:00 0 days 15:00:00 0 days 15:00:00 0 days 14:00:00
2 0 days 13:00:00 0 days 13:00:00 0 days 13:00:00 0 days 13:00:00 0 days 14:00:00 0 days 14:00:00 0 days 14:00:00
3 NaT NaT 0 days 08:00:00 0 days 06:00:00 0 days 10:00:00 0 days 10:00:00 0 days 06:00:00
4 0 days 00:00:00 0 days 16:00:00 0 days 16:00:00 0 days 16:00:00 -1 days +15:00:00 0 days 13:00:00 0 days 14:00:00
5 0 days 00:00:00 0 days 08:00:00 0 days 08:00:00 0 days 08:00:00 0 days 08:00:00 0 days 08:00:00 0 days 06:00:00
6 0 days 08:00:00 0 days 08:00:00 0 days 08:00:00 0 days 08:00:00 0 days 08:00:00 NaT NaT
7 0 days 00:00:00 0 days 15:00:00 0 days 15:00:00 0 days 10:00:00 0 days 10:00:00 0 days 11:00:00 0 days 15:00:00
首先,df_new[i]
沿着列索引df_new
,而不是索引(似乎是您想要的)。相反,使用df_new.loc[i]
,其中沿着列进行索引。此外,您可以使用try
/except
语句来捕获任何引发的KeyError
异常。
df_new = df_hours.dropna()
for i in range(1,150000):
try:
dc = df_new.loc[i]
except KeyError:
continue
...
但是,您应该只遍历DataFrame
的index
,这避免了任何KeyError
异常:
df_new = df_hours.dropna()
for i in df_new.index:
...