Разрезать ряды панд (на основе индекса) на несколько столбцов данных - PullRequest
0 голосов
/ 11 июня 2018

В качестве примера я пытаюсь нарезать поле «дата», содержащее даты в формате ГГГГММДД, на 3 отдельных поля («год», «месяц», «день»).

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

Текущее решение:

df['year'] = df['date'].astype(str).apply(lambda x: x[:4])
df['month'] = df['date'].astype(str).apply(lambda x: x[4:6])
df['day'] = df['date'].astype(str).apply(lambda x: x[6:8])

Ниже приводитсяПример одной из моих попыток упростить код:

df['year'], df['month'], df['day'] = df['date'].astype(str).apply(lambda x: [x[:4], x[4:6], x[6:8]])

Ответы [ 5 ]

0 голосов
/ 12 июня 2018

Вот функциональное решение с использованием operator.attrgetter:

from operator import attrgetter

df = pd.DataFrame({'Date': [20180131, 20180611, 20180513]})

df['Date'] = pd.to_datetime(df['Date'], format='%Y%m%d')

parts = ('year', 'month', 'day')

df['Year'], df['Month'], df['Day'] = zip(*df['Date'].apply(attrgetter(*parts)).values)

print(df)

        Date  Year  Month  Day
0 2018-01-31  2018      1   31
1 2018-06-11  2018      6   11
2 2018-05-13  2018      5   13
0 голосов
/ 11 июня 2018

Вы всегда должны преобразовывать столбцы даты в объект datetime панд.Это можно сделать одним из двух способов: 1. При наложении даты:

 df = pd.read_csv('your-raw_date.csv', parse_dates=[5,7])

ПРИМЕЧАНИЕ. 5 и 7 - это номера столбцов, в которых указаны даты.

Вы можете использовать метод с именем to_datetime для отдельного столбца.см. этот пост для подробностей.

Во-вторых, импортируйте модуль с именем datetime

import datetime as dt

, как только у вас появятся эти две вещи, вы можете сделать такие вещи, как:

df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['day'] = df['date'].dt.day

вы можете делать другие интересные вещи, такие как

dt['signup_date_dayofweek'] = dt['date'].dt.dayofweek

, см. Полную документацию модуля времени данных

0 голосов
/ 11 июня 2018

Поскольку они выглядят как целые числа, забудьте обо всем форматировании строки.

df['year'] = df.date//10**4
df['month'] = df.date//100%100
df['day'] = df.date%100
0 голосов
/ 11 июня 2018

при условии, что столбец date имеет строку (object) dtype:

In [18]: df
Out[18]:
       date
0  20180131
1  20180611
2  20180513

In [19]: df.dtypes
Out[19]:
date    object
dtype: object

решение:

In [22]: df[['year','month','day']] = df.date.str.extract(r'(\d{4})(\d{2})(\d{2})').astype(int)

In [23]: df
Out[23]:
       date  year  month  day
0  20180131  2018      1   31
1  20180611  2018      6   11
2  20180513  2018      5   13

In [24]: df.dtypes
Out[24]:
date     object
year      int32
month     int32
day       int32
dtype: object

PS, если date имеет числовой тип d,тогда я бы выбрал решение @ ALollz ...

0 голосов
/ 11 июня 2018

преобразует строку в дату и время и использует атрибуты .dt. столбцов типа datetime

df.date = pd.to_datetime(df.date, format='%Y%m%d')
df['year'], df['month'], df['day'] = df.date.dt.year, df.date.dt.month, df.date.dt.day

после преобразования даты в дату и время, вы можете обнаружить, что извлечение года, месяца и днядаже не нужно, поскольку атрибуты легко доступны через атрибуты date столбца *1005*.

...