#python #pandas #valueerror
#питон #панды #ошибка значения
Вопрос:
Я провожу некоторый анализ данных по набору данных (https://www.kaggle.com/sudalairajkumar/covid19-in-usa ) и я пытаюсь преобразовать столбец даты и времени (LastModified) в правильный формат даты и времени. Когда я попробовал это сделать в первый раз, он вернул сообщение об ошибке
ValueError: hour must be in 0..23
поэтому я попытался сделать это —
data_df[['date','time']] =
data_df['lastModified'].str.split(expand=True)
data_df['lastModified'] = (pd.to_datetime(data_df.pop('date'),
format='%d/%m/%Y')
pd.to_timedelta(data_df.pop('time') ':00'))
Это выдает ошибку — столбцы должны быть той же длины, что и ключ
Я понимаю, это означает, что оба столбца, которые я разделяю, не имеют одинакового размера. Как мне решить эту проблему? Я относительно новичок в python. Пожалуйста, объясните в понятной форме. большое спасибо
Это весь мой код-
import pandas as pd
dataset_url = 'https://www.kaggle.com/sudalairajkumar/covid19-in-
usa'
import opendatasets as od
od.download(dataset_url)
data_dir = './covid19-in-usa'
import os
os.listdir(data_dir)
data_df = pd.read_csv('./covid19-in-usa/us_covid19_daily.csv')
data_df
data_df[['date','time']] =
data_df['lastModified'].str.split(expand=True)
data_df['lastModified'] = (pd.to_datetime(data_df.pop('date'),
format='%d/%m/%Y')
pd.to_timedelta(data_df.pop('time') ':00'))
Ответ №1:
Похоже, что LastModified находится в формате ISO. Я использовал что-то вроде приведенного ниже для преобразования строки даты iso:
from dateutil import parser
from datetime import datetime
...
timestamp = parser.isoparse(lastModified).timestamp()
dt = datetime.fromtimestamp(timestamp)
...
Ответ №2:
В этой строке:
data_df[['date','time']] = data_df['lastModified'].str.split(expand=True)
Чтобы выполнить это назначение, количество столбцов с обеих сторон =
должно быть одинаковым. разделение может выводить несколько столбцов, но оно сделает это только в том случае, если найдет символ, который он ищет для разделения. По умолчанию он разделяется пробелами. В столбце даты нет пробелов, и поэтому он не будет разделен. Вы можете прочитать документацию для этого здесь.
По этой причине эта строка должна быть такой, чтобы она разделялась на:
data_df[['date','time']] = data_df['lastModified'].str.split('T', expand=True)
Но решение, опубликованное @southiejoe, скорее всего, будет более надежным. Эти временные метки находятся в стандартном формате; их синтаксический анализ — ранее решаемая проблема.
Ответ №3:
Вам нужны эти библиотеки
#import
from dateutil import parser
from datetime import datetime
Затем попробуйте написать что-то подобное для преобразования столбца даты и времени. Таким образом, столбцы должны иметь ту же длину, что и ключ
#convert the time column to the correct datetime format
clock = parser.isoparse(lastModified).timestamp()
#convert the date column to the correct datetime format
data = datetime.fromtimestamp(timestamp)