2016-07-08 2 views
1

Как разбить столбец на два отдельных. Будет ли это способ пойти на это? Я хочу сохранить другие столбцы в DataFrame.Как разбить столбец на два отдельных в DataFrame с Pandas

Например, я столбец с названием «last_created» с кучей дат и времени: «2016-07-01 9:50:09»

Я хочу, чтобы создать две новые столбцы «дата» и " время "со значениями разделения.

Это то, что я пробовал, но он возвращает ошибку. По какой-то причине мои данные были преобразованы из str в float, поэтому я заставил его на str.

def splitter(row): 
    row = str(row) 
    return row.split() 

df['date'],df['time'] = df['last_created'].apply(splitter) 

Ошибка:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-47-e5a9cf968714> in <module>() 
     7  return row.split() 
     8 
----> 9 df['date'],df['time'] = df['last_created'].apply(splitter) 
    10 df 
    11 #splitter(df.iloc[1,1]) 

ValueError: too many values to unpack (expected 2) 

ответ

1

Вы можете сначала конвертировать to_datetime если dtype является object, а затем использовать dt.date и dt.time:

df = pd.DataFrame({'last_created':['2016-07-01 09:50:09', '2016-07-01 09:50:09']}) 
print (df) 
      last_created 
0 2016-07-01 09:50:09 
1 2016-07-01 09:50:09 

print (df.dtypes) 
last_created object 
dtype: object 

df['last_created'] = pd.to_datetime(df.last_created) 

print (df.dtypes) 
last_created datetime64[ns] 
dtype: object 

df['date'], df['time'] = df.last_created.dt.date, df.last_created.dt.time 
print (df) 
     last_created  date  time 
0 2016-07-01 09:50:09 2016-07-01 09:50:09 
1 2016-07-01 09:50:09 2016-07-01 09:50:09 
1

В моем случае, я просто с помощью функции. Исходный код ipython приведен ниже.

In [5]: df = dict(data="", time="", last_created="") 

In [6]: df 
Out[6]: {'data': '', 'last_created': '', 'time': ''} 

In [7]: df["last_created"] = "2016-07-01 09:50:09" 

In [8]: df 
Out[8]: {'data': '', 'last_created': '2016-07-01 09:50:09', 'time': ''} 

In [9]: def splitter(row): 
    ...:  row = str(row) 
    ...:  return row.split() 

In [10]: df["data"], df["time"] = splitter(df["last_created"]) 

In [11]: df 
Out[11]: 
{'data': '2016-07-01', 
'last_created': '2016-07-01 09:50:09', 
'time': '09:50:09'} 
+0

Спасибо Джек. На более крупном df с большим количеством строк возвращается значение error: слишком много значений для распаковки (ожидается 2) – sparrow

1

Следующие должны работать на вас. Тем не менее, сохранение даты и времени в качестве метки времени очень удобно для манипуляций.

df['date'] = [d.split()[0] for d in df['last_created']] 
df['time'] = [d.split()[1] for d in df['last_created']] 
+0

Спасибо! Поскольку значение было преобразовано из str в float, мне пришлось сделать это следующим образом: для d в df ['last_created']: d = str (d) df ['date'] = d.split() [0] – sparrow

Смежные вопросы