【问题标题】:Parse date string and change format解析日期字符串并更改格式
【发布时间】:2011-01-16 22:42:09
【问题描述】:

我有一个格式为“2010 年 2 月 15 日星期一”的日期字符串。我想将格式更改为“15/02/2010”。我该怎么做?

【问题讨论】:

标签: python datetime datetime-parsing


【解决方案1】:

datetime 模块可以帮助您:

datetime.datetime.strptime(date_string, format1).strftime(format2)

具体的例子你可以做

>>> import datetime
>>> datetime.datetime.strptime('Mon Feb 15 2010', '%a %b %d %Y').strftime('%d/%m/%Y')
'15/02/2010'
>>>

【讨论】:

  • format1 需要是一个字符串来表示输入日期字符串的格式。 format2 是要输出的目标字符串格式。
  • strptime 及其格式字符串教程:tutorialspoint.com/python/time_strptime.htm
  • strptimestrftime 是非常强大的功能。奇怪的是我在 python 文档中找不到它们
【解决方案2】:

您可以安装dateutil 库。它的parse 函数可以确定字符串的格式,而无需像使用datetime.strptime 那样指定格式。

from dateutil.parser import parse
dt = parse('Mon Feb 15 2010')
print(dt)
# datetime.datetime(2010, 2, 15, 0, 0)
print(dt.strftime('%d/%m/%Y'))
# 15/02/2010

【讨论】:

  • 如果合法 ISO 字符串的确切格式未知,dateutil.parse 是更好的选择。 ISO 可能包含也可能不包含微秒。它可能包含也可能不包含尾随的“Z”。 datetime.strptime 不够灵活,无法适应。
  • 应谨慎使用Pase Date。 parse('12.07.2017') 返回 datetime(2017, 12, 7, ..) 但 parse('13.07.2017') 返回 .datetime(2017, 7, 13, ...)
  • python 3.x需要安装python-dateutilpip install python-dateutil
  • 只是来自 Michael Kariv 的更新,parse 提供了一个参数 dayfirst,用于区分 YDM 和 YMD 日期 parse docs。)
【解决方案3】:

将字符串转换为日期时间对象

from datetime import datetime
s = "2016-03-26T09:25:55.000Z"
f = "%Y-%m-%dT%H:%M:%S.%fZ"
out = datetime.strptime(s, f)
print(out)
output:
2016-03-26 09:25:55

【讨论】:

【解决方案4】:
>>> from_date="Mon Feb 15 2010"
>>> import time                
>>> conv=time.strptime(from_date,"%a %b %d %Y")
>>> time.strftime("%d/%m/%Y",conv)
'15/02/2010'

【讨论】:

    【解决方案5】:

    由于这个问题经常出现,这里简单解释一下。

    datetimetime 模块有两个重要的功能。

    • strftime - 从日期时间或时间对象创建日期或时间的字符串表示形式。
    • strptime - 从字符串创建日期时间或时间对象。

    在这两种情况下,我们都需要一个格式化字符串。它是表示日期或时间在字符串中的格式。

    现在假设我们有一个日期对象。

    >>> from datetime import datetime
    >>> d = datetime(2010, 2, 15)
    >>> d
    datetime.datetime(2010, 2, 15, 0, 0)
    

    如果我们想从这个日期创建一个格式为'Mon Feb 15 2010'的字符串

    >>> s = d.strftime('%a %b %d %y')
    >>> print s
    Mon Feb 15 10
    

    假设我们想再次将此s 转换为datetime 对象。

    >>> new_date = datetime.strptime(s, '%a %b %d %y')
    >>> print new_date
    2010-02-15 00:00:00
    

    请参阅This 记录有关日期时间的所有格式指令。

    【讨论】:

      【解决方案6】:

      @codeling 和 @user1767754 :以下两行将起作用。我看到没有人针对所询问的示例问题发布完整的解决方案。希望这是足够的解释。

      import datetime
      
      x = datetime.datetime.strptime("Mon Feb 15 2010", "%a %b %d %Y").strftime("%d/%m/%Y")
      print(x)
      

      输出:

      15/02/2010
      

      【讨论】:

        【解决方案7】:

        只是为了完成:当使用strptime() 解析日期并且日期包含一天、一个月等的名称 时,请注意您必须考虑语言环境。

        它也在docs 中作为脚注提及。

        举个例子:

        import locale
        print(locale.getlocale())
        
        >> ('nl_BE', 'ISO8859-1')
        
        from datetime import datetime
        datetime.strptime('6-Mar-2016', '%d-%b-%Y').strftime('%Y-%m-%d')
        
        >> ValueError: time data '6-Mar-2016' does not match format '%d-%b-%Y'
        
        locale.setlocale(locale.LC_ALL, 'en_US')
        datetime.strptime('6-Mar-2016', '%d-%b-%Y').strftime('%Y-%m-%d')
        
        >> '2016-03-06'
        

        【讨论】:

          【解决方案8】:

          您也可以使用 pandas 实现此目的:

          import pandas as pd
          
          pd.to_datetime('Mon Feb 15 2010', format='%a %b %d %Y').strftime('%d/%m/%Y')
          

          输出:

          '15/02/2010'
          

          您可以将 pandas 方法应用于不同的数据类型:

          import pandas as pd
          import numpy as np
          
          def reformat_date(date_string, old_format, new_format):
              return pd.to_datetime(date_string, format=old_format, errors='ignore').strftime(new_format)
          
          date_string = 'Mon Feb 15 2010'
          date_list = ['Mon Feb 15 2010', 'Wed Feb 17 2010']
          date_array = np.array(date_list)
          date_series = pd.Series(date_list)
          
          old_format = '%a %b %d %Y'
          new_format = '%d/%m/%Y'
          
          print(reformat_date(date_string, old_format, new_format))
          print(reformat_date(date_list, old_format, new_format).values)
          print(reformat_date(date_array, old_format, new_format).values)
          print(date_series.apply(lambda x: reformat_date(x, old_format, new_format)).values)
          

          输出:

          15/02/2010
          ['15/02/2010' '17/02/2010']
          ['15/02/2010' '17/02/2010']
          ['15/02/2010' '17/02/2010']
          

          【讨论】:

            【解决方案9】:

            使用日期时间库 http://docs.python.org/library/datetime.html 查找 9.1.7。 特别是 strptime() strftime() 行为¶ 例子 http://pleac.sourceforge.net/pleac_python/datesandtimes.html

            【讨论】:

            • 对于 nimmyliji 上面的错误,你应该完成 datetime.datetime.strptime("Mon Feb 15 2010", "%a %b %d %Y").strftime("%d/%m /%Y") 它给出 '15/02/2010'
            猜你喜欢
            • 2016-06-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-04
            • 2023-03-18
            • 2022-07-04
            • 1970-01-01
            相关资源
            最近更新 更多