как применить регулярное выражение для м / дд / гггг - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть столбец, состоящий из строки, которая содержит дату и время.дата имеет формат: мм / дд / гггг, м / д / гггг, м / дд / гггг и мм / д / гггг, я использовал регулярное выражение, которое помогает мне извлечь мм / дд / гггг и м / д / гггг.Я не могу извлечь m / dd / yyyy и mm / d / yyyy

import pandas as pd
import re

df = pd.read_csv('path of csv file')
corpus = []
for i in range(0,df.shape[0]):
    x = df.iloc[i]['OrderTime']
    if re.search(r'\d{2}/\d{2}/\d{4}',x):  ### for mm/dd/yyyy
        y= re.findall(r'\d{2}/\d{2}/\d{4}',x)
        corpus.append(y)
    elif re.search(r'\d{1}/\d{1}/\d{4}',x): ### for m/d/yyyy
        y= re.findall(r'\d{1}/\d{1}/\d{4}',x)
        corpus.append(y)
    elif re.search(r'\d{1}/\d{2}\d{4}',x): ### for m/dd/yyyy
        y= re.findall(r'\d{1}/\d{2}/\d{4}',x)
        corpus.append(y)
    elif re.search(r'\d{2}/\d{1}\d{4}',x): ### for mm/d/yyyy
        y= re.findall(r'\d{2}/\d{1}/\d{4}',x)
        corpus.append(y)
    else:                     ### empty cells or says nan
        y=["00/00/0000"]
        corpus.append(y)

print(corpus)

, например, - дата 12/1/2017, выходной - 01.02.2017 (проблема с mm / d)/ гггг) для даты типа 1/10/2018 выводится 00/00/0000

Ответы [ 4 ]

0 голосов
/ 26 декабря 2018

Как насчет использования встроенного пардера дат при чтении в файле csv?pd.read_csv(path, parse_dates='OrderTime')

0 голосов
/ 26 декабря 2018

Знаете ли вы, что «количество повторений» может быть диапазоном, а не одним числом?

re.findall(r'\d{1,2}/\d{1,2}\d{4}',x)
               ^^^^^   ^^^^^
0 голосов
/ 26 декабря 2018

Причина этих результатов заключается в том, что вы должны изменить порядок регулярных выражений и поставить самые конкретные из них на первом месте.Ваше регулярное выражение не использует привязку или границу слова, поэтому \d{1}/\d{1}/\d{4} будет соответствовать 2/1/2017 в 12/1/2017.

Обратите внимание, что \d{1} можно записать как \d

Я думаю, что ваш код может быть написан проще, но для вашего текущего подхода вы можете попробовать это так:

import pandas as pd
import re

df = pd.read_csv('path of csv file')
corpus = []
for i in range(0,df.shape[0]):
    x = df.iloc[i]['OrderTime']
    if re.search(r'\d{2}/\d{2}/\d{4}',x):  ### for mm/dd/yyyy
        y= re.findall(r'\d{2}/\d{2}/\d{4}',x)
        corpus.append(y)
    elif re.search(r'\d{2}/\d/\d{4}',x): ### for mm/d/yyyy
        y= re.findall(r'\d{2}/\d/\d{4}',x)
        corpus.append(y)
    elif re.search(r'\d/\d{2}/\d{4}',x): ### for m/dd/yyyy
        y= re.findall(r'\d/\d{2}/\d{4}',x)
        corpus.append(y)
    elif re.search(r'\d/\d/\d{4}',x): ### for m/d/yyyy
        y= re.findall(r'\d/\d/\d{4}',x)
        corpus.append(y)
    else:                     ### empty cells or says nan
        y=["00/00/0000"]
        corpus.append(y)

print(corpus)

Python test

0 голосов
/ 26 декабря 2018

Использование str.split и str.zfill и pd.to_datetime:

df = pd.DataFrame(['12/1/2017', '2/1/2017'], columns=['OrderTime'])
df1[['a','b','c']] = df.OrderTime.str.split('/',expand=True)
df['OrderTime'] = pd.to_datetime(df1.a.str.zfill(2)+'/'+df1.b.str.zfill(2)+'/'+df1.c)

print(df['OrderTime'])

0   2017-12-01
1   2017-02-01
Name: OrderTime, dtype: datetime64[ns]

Если формат должен быть в '%m/%d/%Y', используйте strftime, но это изменяет тип данных на объект.

df.OrderTime.dt.strftime('%m/%d/%Y')
0    12/01/2017
1    02/01/2017
Name: OrderTime, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...