re.search "TypeError: ожидаемая строка или байтовоподобный объект" - PullRequest
1 голос
/ 05 ноября 2019

В моем фрейме данных "df" у меня есть столбец "Datetime", содержащий 500 строк. Каждая строка содержит строковый объект, подобный следующему: 2018-12-23T10: 42: 09.690Z

Было бы очень полезно разделить дату и время на два разных столбца (Дата иВремя).

Дата 2018-12-23

Время 10: 42: 09.69

Я пробовал следующееКод:

#Input:
string = df['Datetime']
#Date
regex_res = re.search(r'(([0-9]{4})[-]([0-9]{2})[-]([0-9]{2}))', string)
print(regex_res.group())

#Output:
TypeError: expected string or bytes-like object

Это работает, если я использую только определенную строку, например "2018-12-23T10: 42: 09.690Z".

#Input:
test = "2018-12-23T10:42:09.690Z"
#Date
regex_res = re.search(r'(([0-9]{4})[-]([0-9]{2})[-]([0-9]{2}))', test)
print(regex_res.group())
#Output:
2018-12-23

Тесты, которые я сделал:

Проверка на нули. Выходные данные дали мне «False» для каждой строки.

nan_rows = [df['Datetime'].isnull()]

Каждая строка имеет тип "class 'str'"

print (df['Datetime'].apply(type))

Что я делаю неправильно? Спасибо за вашу помощь!

С уважением,

Elle

1 Ответ

0 голосов
/ 05 ноября 2019

Чтобы извлечь дату и время в отдельные столбцы из существующего столбца, вы можете использовать

df[['date', 'time']] = df['Datetime'].str.extract(r'\b(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2}\.\d*)Z\b')

Или, чтобы избавиться от конечных нулей в миллисекундной части:

 df[['date', 'time']] = df['Datetime'].str.extract(r'\b(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2}\.\d*?)0*Z\b')

регулярное выражение

\b(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2}\.\d*?)0*Z\b

См. образец демо

Подробности

  • \b - граница слова (удалитьесли дату и время можно приклеить к символам слова)
  • (\d{4}-\d{2}-\d{2}) - Группа 1 (дата): 4 цифры, -, 2 цифры, - и 2 цифры
  • T - T буква
  • (\d{2}:\d{2}:\d{2}\.\d*?) - Группа 2 (время): 2 цифры, двоеточие, повторяется три раза, затем . и любые 0 или более цифр, но как можно меньше
  • 0* - ноль или более 0 символов
  • Z - Z буква
  • \b - граница слова (убрать, если дата и время могут быть склеенык слову chars)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...