использование pd.to_datetime для формирования даты путем ввода года, месяца, дня в разных столбцах в фрейме данных - PullRequest
0 голосов
/ 17 декабря 2018

У меня проблема с объединением столбцов день-месяц-год для формирования столбца даты во фрейме данных с использованием pd.to_datetime.Ниже приводится датафрейм, над которым я работаю, и столбцы Yr, Mo, Dy обозначают год, месяц, день.

data = pd.read_table("/ALabs/wind.data",sep = ',')
Yr  Mo  Dy  RPT     VAL     ROS    KIL      
61  1   1   15.04   14.96   13.17  9.29
61  1   2   14.71   NaN     10.83  6.50 
61  1   3   18.50   16.88   12.33   10.13   

Итак, я попробовал приведенный ниже код и получаю следующую ошибку:для ассемблерных сопоставлений необходимо указать хотя бы [год, месяц, день]: [день, месяц, год] отсутствует "

Шаг 1:

data['Date'] = pd.to_datetime(data[['Yr','Mo','Dy']],format="%y-%m-%d")

Далее я попытался преобразоватьYr, Mo, Dy тип данных столбца для datetime64 от int64 и присвоение результата новым столбцам год, месяц, день.Теперь, когда я пытаюсь объединить столбцы, я получаю правильный формат даты в новом столбце даты, и я понятия не имею, как я получил желаемый результат.

Шаг 2:

data['Year'] = pd.to_datetime(data.Yr,format='%y').dt.year
data['Month'] = pd.to_datetime(data.Mo,format='%m').dt.month
data['Day'] = pd.to_datetime(data.Dy,format ='%d').dt.day
data['Date'] =pd.to_datetime(data[['Year','Month','Day']])

Результат:

Yr  Mo  Dy  Year Month Day  Date
61  1   1   2061    1   1   2061-01-01
61  1   2   2061    1   2   2061-01-02
61  1   3   2061    1   3   2061-01-03
61  1   4   2061    1   4   2061-01-04

Но если я попробую сделать тот же метод, изменив имена столбцов с года, месяца, дня на Yy, Mh, Di, как показано в приведенном ниже коде.Я получаю ту же ошибку: «для сборки отображений требуется указать хотя бы [год, месяц, день]: [день, месяц, год] отсутствует»

Step3:

data['Yy'] = pd.to_datetime(data.Yr,format='%y').dt.year
data['Mh'] = pd.to_datetime(data.Mo,format='%m').dt.month
data['Di'] = pd.to_datetime(data.Dy,format ='%d').dt.day
data['Date'] =pd.to_datetime(data[['Yy','Mh','Di']]) 

Что я хочу знать:

1) Обязательно ли для имен аргументов указывать «Год», «Месяц», «День», если мы используем pd.to_datetime?

2) Есть ли другой способ объединить столбцы в кадре данных для формирования даты, вместо использования этого длинного метода?

3) Эта ошибка характерна только для Python версии 3.7 ??

4) где я ошибся на шаге 1 и шаге 3, и почему я получаю o / p, когда следую за шагом 2?

Ответы [ 2 ]

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

Я действительно не знаю, как Python работает с годами, но причина, по которой он не работал, была связана с тем, что вы использовали 61 год.

Это работает для меня

d = {'Day': ["1", "2","3"],
     'Month': ["1", "1","1"],
     'Year':["61", "61", "61"]}
df = pd.DataFrame(data=d)
df["Year"] = pd.to_numeric(df["Year"])
df.Year = df.Year+2000
df['Date'] = pd.to_datetime(df[['Year','Month','Day']], format='%Y%m%d')
0 голосов
/ 17 декабря 2018

Согласно pandas.to_datetime документам имена столбцов действительно должны быть 'year', 'month' и 'day' (с заглавной буквы первая буква подходит).Это объясняет ответ на все ваши вопросы, и нет, это не имеет ничего общего с версией Python (и все последние версии Pandas ведут себя одинаково).

Кроме того, вы должны знать, что когда вы звонитеto_datetime с последовательностью столбцов (в отличие от одного столбца / списка строк), аргумент format, похоже, игнорируется.Поэтому вам нужно нормализовать свои годы (до 1961 или 2061 или 1061 и т. Д.) Самостоятельно.Вот полный пример того, как вы можете выполнить преобразование в одной строке:

import pandas as pd

d = '''Yr  Mo  Dy  RPT     VAL     ROS    KIL      
61  1   1   15.04   14.96   13.17  9.29
61  1   2   14.71   NaN     10.83  6.50 
61  1   3   18.50   16.88   12.33   10.13  '''
data = pd.read_csv(pd.compat.StringIO(d), sep='\s+')

dtime = pd.to_datetime({k:data[c]+v for c,k,v in zip(('Yr', 'Mo', 'Dy'), ('Year', 'Month', 'Day'), (1900, 0, 0))})
print(dtime)

Вывод:

0   1961-01-01
1   1961-01-02
2   1961-01-03
dtype: datetime64[ns]

В приведенном выше коде вместо добавления столбцов с соответствующими именами вdataframe data, я только что определил, где пары ключ / значение, например.('Year', data['Yr']), а также добавил 1900 к годам.

Вы можете немного упростить понимание слова, просто добавив 1900 непосредственно в соответствующий столбец:

data['Yr'] += 1900
dtime = pd.to_datetime({k:data[c] for c,k in zip(('Yr', 'Mo', 'Dy'), ('year', 'month', 'day'))})

Этот код будет иметь тот же вывод, что и предыдущий.

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