如何在python中通过多种格式格式化日期字符串

Posted

技术标签:

【中文标题】如何在python中通过多种格式格式化日期字符串【英文标题】:How to format date string via multiple formats in python 【发布时间】:2014-06-28 04:02:41 【问题描述】:

我有三种日期格式:YYYY-MM-DDDD.MM.YYYYDD/MM/YYYY

是否可以验证和解析2014-05-1818.5.201418/05/2019等字符串?

【问题讨论】:

你看过dateutil吗 - 失败了 - 只需依次尝试strptimeing每3个看看它们是否有效,否则失败...... 感谢您的评论。我想使用没有第三方库的纯python 【参考方案1】:

为了给@jon-clements 已经很好的答案添加一点,

为可追溯性目的对引发的异常添加了一些详细信息

from datetime import datetime

def try_parsing_date(possible_date, field):
    """
    Try to parse a date using several formats, warn about
    problematic value if the possible_date does not match
    any of the formats tried
    """
    for fmt in ('%Y-%m-%d', '%d/%m/%Y', '%m/%d/%Y'):
        try:
            return datetime.strptime(possible_date, fmt)
        except ValueError:
            pass
    raise ValueError(f"Non-valid date format for field field: 'possible_date'")

这里,possible_date 是可能包含其中一种格式的日期的文本,field 是您正在测试的变量或列。这样更容易找到有问题的值

【讨论】:

【参考方案2】:

这实际上是我面临的一个问题,这是我处理它的方式,我的主要目的是日期分隔符

class InputRequest:
     "This class contain all inputs function that will be required in this program. "

      def __init__(self, stockTickerName = 'YHOO', stockSite='yahoo', startDate = None, 
             endDate = datetime.date.today()):

      def requestInput(self, requestType =''):
          "Fro requesting input from user"
          self.__requestInput = input(requestType)
          return self.__requestInput


def dateFormat(self, dateType=''):
    '''
        this function handles user date input
        this repeats until the correct format is supplied
        dataType: this is the type of date, eg: DOF, Date of Arriveal, etc 

    '''
    while True:
        try:
            dateString = InputRequest.requestInput(self,dateType)
            dtFormat = ('%Y/%m/%d','%Y-%m-%d','%Y.%m.%d','%Y,%m,%d','%Y\%m\%d') #you can add extra formats needed
            for i in dtFormat:
                try:
                    return datetime.datetime.strptime(dateString, i).strftime(i)
                except ValueError:
                    pass

        except ValueError:
            pass
        print('\nNo valid date format found. Try again:')
        print("Date must be seperated by either [/ - , . \] (eg: 2012/12/31 --> ): ")

【讨论】:

【参考方案3】:

纯蟒蛇:

from datetime import datetime
my_datetime = datetime.strptime('2014-05-18', '%Y-%m-%d') 
repr(my_datetime)

>>> 'datetime.datetime(2014,5,18,0,0)'

查看 datetime.strptime() 格式文档以获取更多格式字符串。

【讨论】:

解决方案应扩展为使用所有日期格式并说明如何选择适合的格式。 @HansThen 你是对的,但上面的答案已经正确回答了这个问题,没有什么可补充的。 是的,@Jon Clements 很难改进。【参考方案4】:

尝试每种格式,看看是否有效:

from datetime import datetime

def try_parsing_date(text):
    for fmt in ('%Y-%m-%d', '%d.%m.%Y', '%d/%m/%Y'):
        try:
            return datetime.strptime(text, fmt)
        except ValueError:
            pass
    raise ValueError('no valid date format found')

【讨论】:

如果我们有海量数据和多种日期格式,那么在时间复杂度上循环一个循环是可行的?会不会很慢?【参考方案5】:
>>> import dateutil.parser
>>> dateutil.parser.parse(date_string)

这应该处理 Python 2.7+ 中的大多数标准日期格式。如果你真的有超级自定义的日期格式,你总是可以回退到 Jon Clements 提到的那个。

【讨论】:

这很好用,但如果提前知道日期格式,Jon Clements 尝试每种格式并捕获异常的解决方案可能会更快。

以上是关于如何在python中通过多种格式格式化日期字符串的主要内容,如果未能解决你的问题,请参考以下文章

python 将日期戳(五位数时间)转换为标准时间

如何在EXCEL中将字符转成日期 如19970828转成1997-08-28

将包含多种字符串日期格式的列转换为 Spark 中的 DateTime

如何处理python系列中的多种日期字符串格式

如何在 Android 中通过客户端获取订阅的到期日期?

使用ivx实现日期格式转换的经验总结