Я попытался разбить столбец даты на 3 отдельных столбца.
df[['date1', 'date2', 'date3']] = df['Date'].str.split('/')
Вот ошибка, которую я получаю
ValueError: Columns must be same length as key
Он отлично работает, когда я просто набираю df['Date'].str.split('/') и могу подтвердить, что в каждом списке есть только 3 элемента.
Я думаю, что это может быть связано с тем, что некоторые даты не имеют полного года, поэтому длина столбца варьируется, но я не уверен, почему это имеет значение здесь.
df['Date'].value_counts()
22/05/2022 10
26/12/05 10
26/12/08 10
11/05/14 10
12/05/2019 10
..
28/02/05 1
14/09/2015 1
27/09/2015 1
28/09/2015 1
17/08/2015 1
df['Date'].str.len().value_counts()
8.0 4850
10.0 2280
Name: Date, dtype: int64
Ошибка вызвана тем, что не все даты в столбце «Дата» имеют одинаковую длину.
В первом формате 22.05.2022 длина 8 символов, а во втором формате 26.12.05 длина всего 6 символов.
Решением было бы сначала преобразовать все даты в одинаковую длину:
def convert_date(date):
if len(date) == 8:
date = "20" + date[-2:] + "/" + date[:2] + "/" + date[3:5]
return date
df['Date'] = df['Date'].apply(convert_date)
Затем вы можете разделить даты на отдельные столбцы, используя:
df[['date1', 'date2', 'date3']] = df['Date'].str.split('/')
По умолчанию Series.str.split возвращает серию (то есть один «столбец») со списками, содержащими элементы разделения).
df['Date'].str.split('/')
0 [22, 05, 2022]
1 [26, 12, 05]
2 [26, 12, 08]
3 [11, 5, 2014]
4 [12, 5, 2019]
5 [28, 02, 05]
6 [14, 09, 2015]
7 [27, 09, 2015]
8 [28, 09, 2015]
9 [17, 08, 2015]
Name: Date, dtype: object
Итак, ошибка, которую вы получаете, является результатом попытки назначить этот единственный «столбец» трем новым столбцам. Чтобы это исправить, вам нужно установить параметр expand
на True
. Это расширит результат на три разных столбца, которые мы затем можем назначить по назначению:
df[['date1', 'date2', 'date3']] = df['Date'].str.split('/', expand=True)
df
Date Count date1 date2 date3
0 22/05/2022 10 22 05 2022
1 26/12/05 10 26 12 05
2 26/12/08 10 26 12 08
3 11/5/2014 10 11 5 2014
4 12/5/2019 10 12 5 2019
5 28/02/05 1 28 02 05
6 14/09/2015 1 14 09 2015
7 27/09/2015 1 27 09 2015
8 28/09/2015 1 28 09 2015
9 17/08/2015 1 17 08 2015
Используемые данные
import pandas as pd
data = {'Date': {0: '22/05/2022', 1: '26/12/05', 2: '26/12/08', 3: '11/5/2014',
4: '12/5/2019', 5: '28/02/05', 6: '14/09/2015', 7: '27/09/2015',
8: '28/09/2015', 9: '17/08/2015'},
'Count': {0: 10, 1: 10, 2: 10, 3: 10, 4: 10, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1}}
df = pd.DataFrame(data)
Между прочим, в то время как вышеприведенное должно заставить работать назначение, если вы уверены, что логика строк даты всегда: день / месяц / год (несмотря на различия в форматировании), вероятно, лучше полагаться на pd .to_datetime с параметром dayfirst
, установленным на True
, а затем использовать Series.dt.day и то же самое для month
и year
:
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
df['day'] = df['Date'].dt.day
df['month'] = df['Date'].dt.month
df['year'] = df['Date'].dt.year
df
Date Count day month year
0 2022-05-22 10 22 5 2022
1 2005-12-26 10 26 12 2005
2 2008-12-26 10 26 12 2008
3 2014-05-11 10 11 5 2014
4 2019-05-12 10 12 5 2019
5 2005-02-28 1 28 2 2005
6 2015-09-14 1 14 9 2015
7 2015-09-27 1 27 9 2015
8 2015-09-28 1 28 9 2015
9 2015-08-17 1 17 8 2015
Обратите внимание, что таким образом вы получите правильные и согласованные значения int
.