Python - определяет, является ли список значений / строк датами, временем, датой или ни того, ни другого - PullRequest
0 голосов
/ 28 октября 2018

Учитывая список значений или строк, как я могу определить, являются ли они датами, датой и временем или нет?

Я использовал 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']

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Вот кое-что, что даст вам именно то, что вы просили использовать 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), но это было бы относительно просто реализовать.

0 голосов
/ 28 октября 2018

Вы можете написать функцию, которая будет возвращать значения в зависимости от указанных вами условий:

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'

Вы должны знать, что Панды datetime серии всегда включают время. Внутри они хранятся как целые числа, и если время не указано, оно будет установлено на 00:00:00.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...