You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

处理Yelp营业时间数据:dropna()后循环索引缺口问题求解

问题描述

我正在使用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

使用dropna()后变为:

index,0
0,0.0
1,1.0
2,3.0
4,4.0
5,5.0

可见索引从2直接跳到4。

原本的循环通过遍历range(1,150000)来计算每周总营业时间,但因部分索引不存在而报错终止,代码如下:

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)

请问如何修改循环,使其跳过这些不存在的索引行?

解决方案

方法1:直接遍历DataFrame元素

无需通过索引访问,直接遍历df_new的每一行,自动跳过缺失索引:

df_new = df_hours.dropna()

for dc in df_new:
    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)

方法2:重置索引

使用reset_index(drop=True)生成连续索引,之后可通过range遍历:

df_new = df_hours.dropna().reset_index(drop=True)

for i in range(len(df_new)):
    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)

方法3:检查索引是否存在

若需保留原索引,可在循环中先判断索引是否存在于df_new的索引列表:

df_new = df_hours.dropna()

for i in range(1,150000):
    if i not in df_new.index:
        continue
    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)

内容的提问来源于stack exchange,提问作者Tegh Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:36:29