Есть ли способ проверить, является ли переменная время в часе: формат минутного часового пояса? - PullRequest
0 голосов
/ 30 июня 2019

Мне нужна помощь в очистке одного столбца моего информационного кадра, который содержит дату или время в зависимости от строки. Я хочу вытащить дату и перечислить ее в отдельный столбец для каждой строки метки времени. Как мне использовать iterrows, datetime и условный оператор для этого?

Я делаю персональный проект, чтобы вытащить графики приливов в кадр данных панд. Мне удалось успешно очистить данные, но результирующий фрейм данных немного дезорганизован, и я пытаюсь его очистить. Моя проблема заключается в том, что в первом столбце информационного кадра указана текущая дата, а в последующих строках указан ряд раз для этой даты, соответствующих приливу, отливу и т. Д. Я хочу вытащить дату из этого столбца и создать новый, где он указан для каждой отметки времени, и я хочу использовать условное выражение, чтобы проверить, находится ли строка в формате даты или в формате времени. Я знаю, что могу использовать iterrows, чтобы проходить строки по очереди, и я почти уверен, что должен каким-то образом использовать datetime.time.hour и datetime.time.minute, но мне неясно, как это сделать.

Простая версия этой проблемы была бы, если бы у вас был один столбец кадра данных, разобранный в массив, который чередовал значения времени и даты:

array1 = ['1 January', '12:00 AM', '2 January, '1:00AM', etc.] 

как бы вы удалили даты и поместили их в отдельный столбец? (или массив в этом случае.) Я должен добавить, что у вас будет другой массив, который содержит значения времени для соответствующих записей в массиве1, которые имеют даты и не имеют значений для записей времени:

array2 = ['12 PM', NaN, '1 PM', Nan, etc.]

для пояснения Я использую BeautifulSoup для анализа и очистки HTML, поэтому я почти уверен, что все значения являются строками. Кроме того, фактический фрейм данных не обязательно должен иметь одинаковый интервал между значениями даты, т.е. они не чередуются, поэтому я не могу просто удалить все остальные значения .

Ответы [ 3 ]

2 голосов
/ 30 июня 2019

Я настоятельно рекомендую использовать dateparser для преобразования str в правильный datetime формат:

>>> import dateparser
>>> dateparser.parse('1 January')
datetime.datetime(2019, 1, 1, 0, 0)
>>> dateparser.parse('12:00 AM')
datetime.datetime(2019, 6, 30, 0, 0)

как бы вы удалили даты и поместили их в отдельный столбец?

Я бы использовал стандартный цикл списка:

dates = []
times = []
for v in array1:
    if any(w in v for w in ['January', 'February', 'March', 'April']):  # to be continued
        dates.append(v)
    elif any(w in v for w in ['AM', 'PM']):
        times.append(v)
    else:
        raise Exception("Undetected")
0 голосов
/ 01 июля 2019

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

d = {'col1': ['1 January', '12:00 AM', '2 February', '1:00AM']}
df = pd.DataFrame(d)

# can use regex like
df['col2'] = df[ df['col1'].str.contains ("^\d:|^\d\d:", regex = True)]

OR

# if want the months like
df['col2'] = df[ df['col1'].str.contains ('Jan|Feb')]
df
0 голосов
/ 30 июня 2019

Вы можете использовать модуль «Время».

import time

#Basic time and date can be extracted using:  
date_time = time.asctime(time.localtime(time.time()))

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

splitted = date_time.split(' ')    
time = splitted[<integer here>] #<< Since this is a list, you can select the items you want to assign to the variable.

После этого вы можете сравнить его в утверждении. Обязательно распечатайте разделенную переменную, чтобы знать, что вы выбрали нужные элементы из списка.

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