【问题标题】:Python - Detect if list of values/strings are dates, times, datetime, or neitherPython - 检测值/字符串列表是日期、时间、日期时间还是两者都不是
【发布时间】:2019-04-01 17:49:09
【问题描述】:

给定一个值或字符串列表,我如何检测它们是日期、日期和时间,还是两者都不是?

我使用 pandas api 来推断数据类型,但它不适用于日期。见例子:

import pandas as pd

def get_redshift_dtype(values):
    dtype = pd.api.types.infer_dtype(values)
    return dtype

这是我正在寻找的结果。对更好的方法有什么建议吗?

# Should return "date"
values_1 = ['2018-10-01', '2018-02-14', '2017-08-01']

# Should return "date"
values_2 = ['2018-10-01 00:00:00', '2018-02-14 00:00:00', '2017-08-01 00:00:00']

# Should return "datetime"
values_3 = ['2018-10-01 02:13:00', '2018-02-14 11:45:00', '2017-08-01 00:00:00']

# Should return "None"
values_4 = ['123098', '213408', '801231']

【问题讨论】:

    标签: python python-3.x pandas csv datetime


    【解决方案1】:

    您可以编写一个函数来根据您指定的条件返回值:

    def return_date_type(s):
        s_dt = pd.to_datetime(s, errors='coerce')
        if s_dt.isnull().any():
            return 'None'
        elif s_dt.normalize().equals(s_dt):
            return 'date'
        return 'datetime'
    
    return_date_type(values_1)  # 'date'
    return_date_type(values_2)  # 'date'
    return_date_type(values_3)  # 'datetime'
    return_date_type(values_4)  # 'None'
    

    您应该知道 Pandas datetime 系列总是包含时间。在内部,它们被存储为整数,如果没有指定时间,它将被设置为00:00:00。

    【讨论】:

      【解决方案2】:

      这里有一些东西可以准确地满足您使用re 的要求

      import re
      
      classify_dict = {
          'date': '^\d{4}(-\d{2}){2}$',
          'date_again': '^\d{4}(-\d{2}){2} 00:00:00$',
          'datetime': '^\d{4}(-\d{2}){2} \d{2}(:\d{2}){2}$',
      }
      
      def classify(mylist):
          key = 'None'
          for k, v in classify_dict.items():
              if all([bool(re.match(v, e)) for e in mylist]):
                  key = k
                  break
          if key == 'date_again':
              key = 'date'
          return key
      
      classify(values_2)
      >>> 'date'
      

      检查是使用regex 迭代完成的,它会尝试匹配列表中的所有项目。只有当所有项目都匹配时,才会返回密钥。这适用于您提供的所有示例列表。

      目前,正则表达式字符串不检查超出特定范围的数字,例如 (25:00:00),但实现起来相对简单。

      【讨论】:

        猜你喜欢
        • 2015-04-05
        • 1970-01-01
        • 2020-03-08
        • 1970-01-01
        • 2020-02-26
        • 1970-01-01
        • 2022-07-21
        • 1970-01-01
        • 2020-06-19
        相关资源
        最近更新 更多