【问题标题】:Python .split IndexErrorPython .split 索引错误
【发布时间】:2016-05-14 15:19:57
【问题描述】:

Python 新手。尝试调用 .split 来分隔时间值,以便我可以计算 4 月的所有登录日期:如果我调用 response['data]

,这就是数据的样子
[{u'email': u'wilderman.nyree@heidenreich.com'}, {u'login_date': u'2014-05-04T04:09:29-07:00', u'email': u'vrippin@gmail.com'}, {u'login_date': u'2014-04-13T20:37:31-04:00', u'email': u'eileen.gusikowski@oreilly.info'}, {u'login_date': u'2014-05-11T15:34:17-04:00', u'email': u'cstehr@keebler.com'}, {u'login_date': u'2014-04-13T17:12:20-04:00', u'email': u'onolan@gmail.com'}, {u'login_date': u'2014-04-01T02:22:55+05:00', u'email': u'ygoyette@yahoo.com'}, {u'login_date': u'2014-04-22T21:04:03+04:00', u'email': u'vblanda@gmail.com'}, {u'login_date': u'2014-05-08T22:30:57-04:00', u'email': u' ybartoletti@littel.biz'}, {u'login_date': u'2014-04-25T13:27:48-08:00', u'email': u'woodie.crooks@kozey.com'}, {u'login_date': u'2014-04-14T02:18:48-07:00', u'email': u'emilia16@block.com'}, {u'login_date': u'2014-04-20T11:02:21-10:00', u'email': u'bahringer.karl@yahoo.com'}, {u'login_date': u'2014-04-27T11:08:50+10:00', u'email': u'morissette.lalla@kuhicmuller.com'}]

等等等等……当我运行这段代码时:

 loggedList = [user['login_date'] for user in response['data']]
 for login in loggedList:
    if login is not None:
     aprilList.append('-' + login.split('-')[0])


 # print aprilList
 print response['data']

我在控制台中得到这个打印输出:

u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014', u'-2014']

但是当我尝试通过将 login.split('-')[0]) 更改为 login.split('-')[1]) 来访问 .split 列表的第二部分时,我得到一个 IndexError 列表超出范围。

如何访问登录日期的月份部分?我想我很接近了,它用 .split 方法隐藏在某个地方。

【问题讨论】:

    标签: python list python-2.7 date python-2.x


    【解决方案1】:

    如果您查看login.split('-')[0]) 的输出,您会注意到其中一个是u'-',

    这很可能意味着您的一个数据条目的登录日期为空,因此 login.split 给出了一个仅包含空字符串的数组。这有 1 个元素,所以第二个索引超出范围

    要么确保所有数据格式正确且完整,要么仅在 login.split 的结果足够长时尝试打印月份

    【讨论】:

    • 好的,我明白了,有没有一种快速的方法来规范化数据以将它们剔除?
    • @AdamWeitzman 您可以在访问元素之前检查长度。 if len(login.split('-')) == 2,或者类似的东西。
    • @shravster 可能 >=2。
    【解决方案2】:

    使用 dateutil 模块来执行此操作。

    from dateutil import parser
    d = parser.parse("2014-04-13T20:37:31-04:00")
    print d.month
    

    【讨论】:

    • 很好!但是当我尝试将日期作为变量传递时,出现 AttributeError: 'NoneType' object has no attribute 'read' 错误
    • 我的错,我认为这与其中一个登录为空白有关
    【解决方案3】:

    如果响应中的每个元素都存在login_date,则添加验证,我还建议将您的date 解析为datetime.datetime 格式,以便您可以访问所有时间参数:

    import dateutil.parser as dp
    
    for user in response['data']:
        if user['login_date']:
            print dp.parse((user['login_date'])).month
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 2017-02-23
      • 2018-02-22
      • 2019-03-03
      • 2016-06-16
      • 2014-01-27
      • 2020-10-26
      相关资源
      最近更新 更多