【发布时间】:2019-12-18 16:03:50
【问题描述】:
我想将日期时间从 str (如 2008-1-12 00:00:00)转换为 20080112,即 Excel 列中的 datetimes。我的程序如下:
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
程序运行的结果很奇怪,大部分值都成功转换为20121231这样的8位字符,但也有一些保持不变:
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
一开始我以为可能是Excel单元格格式设置造成的。但是,经过验证程序的输出,程序的String拼接没有问题,但是好像新的字符串并没有成功分配给datetimes[num]。我真的不知道为什么?谁能帮帮我?
【问题讨论】:
-
你只需要
import datetime from datetime和datetime.strptime('2008-10-12 00:00:00', '%Y-%m-%d %H:%M:%S').strftime('%Y%m%d')。 -
@accdias,这绝对是一个好方法。我更喜欢 dateutil 解析器,因为我总是很方便,但这是实现它的本机方式。我唯一不喜欢的是修改明确的日期格式。如果您在传入日期列中有不同的格式,您可能会得到奇怪的结果。
-
@Kelvin,是的,但似乎 OP 在该数据上只有一种日期时间格式,所以我想使用它是安全的。
-
我投票关闭它,因为错字/无法复制,因为似乎 OP 只是忘记检查大于/小于或等于。
-
有点自私,但我会为那些不熟悉 Python 并在日期转换方面遇到困难的其他人开放,以使其指向更清洁的库或内置功能的方向
标签: python list datetime datetime-format enumerate