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