【问题标题】:change datetime format in python list更改python列表中的日期时间格式
【发布时间】: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 datetimedatetime.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


【解决方案1】:

您可能想要使用事实上的 dateutil 库。 https://dateutil.readthedocs.io/en/stable/

你可以这样做:

from dateutil import parser
dt = '2008-1-12 00:00:00'
parser.parse(dt).strftime("%Y%m%d")

>>'20080112'

经常滚动你自己的可能真的很容易出错并且很复杂。

【讨论】:

  • 漂亮的方法,我已将这些应用到我的代码中,非常感谢!
【解决方案2】:

如果您查看每个转换失败的日期,您会看到一个模式:

2008-10-11 00:00:00
2009-10-24 00:00:00
2016-10-11 00:00:00
2015-10-13 00:00:00

所有的月份值都是10

现在看看你的条件:

int(month) < 10 and int(day) < 10:
int(month) < 10 and int(day) > 10:
int(month) > 10 and int(day) < 10:
int(month) > 10 and int(day) > 10:

您永远不会认为月份或日期正好是 10。所有条件都不成立,因此没有任何变化。

要么添加一个else 案例来处理这些实例,要么将一些&lt; 更改为&lt;= 以处理10 个。

【讨论】:

  • 太棒了!我太粗心了,谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
相关资源
最近更新 更多