2017-04-17 175 views
1

我有一個數據框與多列其中之一是日期列。目前該列中的數據採用以下格式:2012年2月1日9:30Python,熊貓分裂成兩列

但是,我想將其分成兩個單獨的列,日期:2012年2月1日和時間:9:30

我已經找到了以下解決方案:

df = pd.DataFrame(df.date.str.split(' ',1).tolist(), columns = ['date','time']) 

但是這將創建只包含兩個新的分割列,而不是其他人,以及一個新的數據幀。

有沒有辦法在不創建新數據框的情況下拆分現有數據框的列?

什麼是解決這個問題的計算最有效的方法? (我處理的數據集包含約20百萬行)

回答

3

試試這個:

df[['date','time']] = df.pop('date').str.split(expand=True) 

演示

In [274]: df 
Out[274]: 
       date 
0 02/01/2012 9:30 
1 02/01/2012 9:30 
2 02/01/2012 9:30 

In [275]: df[['date','time']] = df.pop('date').str.split(expand=True) 

In [276]: df 
Out[276]: 
     date time 
0 02/01/2012 9:30 
1 02/01/2012 9:30 
2 02/01/2012 9:30 
+2

有一天......我會記得使用'pop' – piRSquared

+0

這個工作,但是當我運行它時,我的物理內存使用量猛增到幾乎100%,但我想這只是因爲數據集是巨大的。 –

3

如果您date列是字符串,你只是想分割。 ..那麼這應該工作

date_time = df.date.str.split(expand=True).rename(columns={0: 'date', 1: 'time'}) 
df = df.drop('date', 1).join(date_time) 
print(df) 

    A B  date time 
0 1 2 02/01/2012 9:30 

設置
假設一個數據幀df

df = pd.DataFrame(dict(date=['02/01/2012 9:30'], A=[1], B=[2])) 

print(df) 

    A B    date 
0 1 2 02/01/2012 9:30 

但是,假設你date列實際上是日期時間

df = pd.DataFrame(dict(date=pd.to_datetime(['02/01/2012 9:30']), A=[1], B=[2])) 

print(df) 

    A B    date 
0 1 2 2012-02-01 09:30:00 

那麼我們

df = df.assign(date=df.date.dt.date, time=df.date.dt.time) 

print(df) 

    A B    date 
0 1 2 2012-02-01 09:30:00