2017-04-17 107 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