Определить столбцы даты в CSV-файле с Python - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть простой *.csv файл, в котором некоторые столбцы являются датами в формате mm/dd/yy.Вот пример:

$ cat somefile.csv
05/09/15,8,Apple,05/09/15
06/10/15,5,Banana,06/10/12
05/11/18,4,Carrot,09/03/18
02/09/15,2,Apple,01/09/15

Я хочу легко определить, содержит ли столбец только допустимые даты, но я испытываю трудности с подсчетом '/' и подсчетом символов.Конечно, есть какой-то простой способ сделать это правильно?

РЕДАКТИРОВАТЬ (Ответ от @RahulAgarwal)

Вот мой сценарий (который все еще не работает: (()

###########
# IMPORTS #
###########
import csv
import sys
import numpy
from dateutil.parser import parse

###########################
# [1] Open input csv file #
###########################
myfile=open("input4.csv","r")
myreader = csv.reader(myfile)

############################
# [2] read header csv file #
############################
for myline in myreader:
    myheader=myline
    break

####################################################################
# [3] read and put in ds only data originating in specific columns #
####################################################################
for myline in myreader:
    for myColIndex in range(len(myline)):
        if (parse(myline[myColIndex])):
            print("column = {0}".format(myColIndex))

######################
# [4] Close csv file #
######################
myfile.close()

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Вы можете использовать метод strptime объекта datetime:

from datetime import datetime
def isDateValid(date, pattern = "%d/%m/%y"):
    try:
        datetime.strptime(date, pattern)
        return True
    except ValueError:
        return False

Метод strptime вызывает ValueError , если строка не соответствует шаблон .

РЕДАКТИРОВАТЬ:

, чтобы позволить эту работу:

from datetime import datetime
def isDateValid(date, pattern = "%d/%m/%y"):
    try:
        datetime.strptime(date, pattern)
        return True
    except ValueError:
        return False

# load file
with open("filename.csv") as f:
    # split file into lines
    lines = f.readlines()

    # replace new-line character
    lines = [x.replace("\n", "") for x in lines]

    # extract the header
    header = lines[0]

    # extract rows
    rows = lines[1:]

    # loop over every row
    for rowNumber, row in enumerate(rows, 1):
        # split row into the seperate columns
        columns = line.split(",")

        # setting default value for every row
        gotValidDate = False

        # loop over every column
        for column in columns:
            # check if the column got a valid date
            if isDateValid(column):
                gotValidDate = True

        # if at least one out of all columns in that row got a valid date
        # the row number gets printed
        if gotValidDate:
            print(f"Row {rowNumber} got at least one valid date")

(код написан на Python 3.7)

0 голосов
/ 23 ноября 2018

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

import csv
from datetime import datetime

with open('yourfile.csv') as fin:
    seen_columns = set()
    invalid_columns = set()
    for row in csv.reader(fin):
        for colno, col in enumerate(row, 1):
            # We've seen it contains a non-date - don't try and parse it again
            if colno in invalid_columns:
                continue

            # Make a note we've seen column N
            seen_columns.add(colno)

            # Try and see if we can parse it to the desired date format
            try:
                datetime.strptime(col, '%m/%d/%y')
            # Nope - we couldn't... not a date - so don't both checking again
            except ValueError:
                invalid_columns.add(colno)

    # Columns containing dates are those we've seen that
    # didn't fail to parse as a date...
    valid_columns = seen_columns - invalid_columns
0 голосов
/ 23 ноября 2018

Вы можете попробовать ниже проверить действительные даты:

from dateutil.parser import parse
parse("05/09/15")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...