要处理一批文本类型的日期数据,这些文本日期的格式均为 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,各位大神帮忙分析一下吧!
可能是你数据源部分数据未进行格式统一,试试下面这样转换日期文本格式
若确定输入源格式是标准日期格式,解析转换格式便可