Проблемы с преобразованием даты и времени в правильный формат — столбцы должны быть той же длины, что и ключ

#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)