python 迭代更改列表值异常

要处理一批文本类型的日期数据,这些文本日期的格式均为 2008-01-31 00:00:00 这样的格式,目标是通过一个函数转化为 20080131 这样的文本样式,于是乎写了一个转化程序:

def btk_datetime2cvh(table, title):
    datetimes = list(table[title])
    dmyhms_pattern = re.compile(r"^((?:19|20)\d\d)-(0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[01])\s+(20|21|22|23|[0-1]\d:[0-5]\d:\[0-5]\d)$")

    for num, dt in enumerate(datetimes):
        try:
            year, month, day, time = dmyhms_pattern.findall(dt)[0]
            if int(month) < 10 and int(day) < 10:
                datetimes[num] = year + "0" + str(int(month)) + "0" + str(int(day))
            elif int(month) < 10 and int(day) > 10:
                datetimes[num] = year + "0" + str(int( month)) + day
            elif int(month) > 10 and int(day) < 10:
                datetimes[num] = year + month + "0" + str(int(day))
            elif int(month) > 10 and int(day) > 10:
                datetimes[num] = year + month + day
        except (ValueError,TypeError,IndexError):
            datetimes[num] = "!" + str(dt)

    table[title] = pd.Series(datetimes)
    return table

加载 table 数据后,根据 title 获得日期列 datetimes,然后对其进行迭代处理,利用 enumerate 函数获得 datetimes 每次迭代的序号和值,并利用正则表达式获得 year, month, year,time,然后拼接日期并将拼接好的日期写入相应的datetimes[num],最终为了保证出来的日期均为 20121231 这种 8 位文本,特地做了补 "0",结果却很奇葩,大部分结果符合预期,但是仍有部分结果保持原样:

2008-10-11 00:00:00 #异常
2009-10-24 00:00:00 #异常
20070529
20051211
20060818
2016-10-11 00:00:00 #异常
20160503
20170908
20170908
20170908
20170908
20170908
20170908
20170908
20170908
20170908
20170908
20170908
20170908
20170908
20170908
20170906
20170906
20170906
20170906
2015-10-13 00:00:00 #异常
20170908

开始还以为是 excle 表中单元格格式设置问题,结果喝茶了了一下,发现拼接出来的确实都是 8 位样式的日期,但是输出相应的 datetimes[num] 竟然像是没有赋值成功一样,原值压根没变······实在百思不得其解,使用的是 python 3.6.8,各位大神帮忙分析一下吧!

阅读 3.1k
2 个回答

可能是你数据源部分数据未进行格式统一,试试下面这样转换日期文本格式

title = "2008-01-31 00:00:00"
s = title.lstrip().split(" ")[0].replace("-", "",-1)
print(s)
20080131

若确定输入源格式是标准日期格式,解析转换格式便可

from dateutil import parser

stdDateStr = "2008-1-3 00:00:00"
d = parser.parse(stdDateStr).strftime('%Y%m%d')
print(d)
# 20080103

仔细核查了一下程序,发现是由于逻辑不闭合导致的:<10 or >10的判断条件均不覆盖=10的情况,导致凡是带有10的日期文本都没有被处理,是我大意了...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进