Python-检测值/字符串列表是日期、时间、日期时间还是两者都不是

Python-检测值/字符串列表是日期、时间、日期时间还是两者都不是,python,python-3.x,pandas,csv,datetime,Python,Python 3.x,Pandas,Csv,Datetime,给定一个值或字符串列表,如何检测它们是日期、日期和时间,还是两者都不是 我曾使用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 = ['

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

我曾使用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']

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

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

,这里有一些东西可以准确地告诉您使用
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),但实现起来相对简单