2016-07-07 128 views
2

所以我试图将2列转换为1日期时间列。输入列是这样的:python3.5 /熊猫 - 将多列转换为日期时间

date   hour 
1/1/2015   1 
1/1/2015   2 
1/1/2015   3 

其中df.date值是stringdf.hour值是int。我想这两列转换成一个这样的:

datetime 
2015-1-1 1:00:00 
2015-1-1 2:00:00 
2015-1-1 3:00:00 

我想到了一个简单的df['x'] = pd.to_datetime(df[['date', 'hour']]的工作,但我得到一个ValueError结果

+0

频率是否始终为1小时? –

+0

@JoeR是的,频率总是在1小时的间隔。对不起,忘了澄清。 – sndrosilva

+0

@JoeR。那么,有时可能会有一个观察失误,这就是为什么我想从2列转换它。 – sndrosilva

回答

2

您可以将两列粘贴在一起,作为一个单柱,然后用相应的format参数转换:

pd.to_datetime(df['date'] + ' ' + df['hour'].astype(str), format = "%d/%m/%Y %H") 

# 0 2015-01-01 01:00:00 
# 1 2015-01-01 02:00:00 
# 2 2015-01-01 03:00:00 
# dtype: datetime64[ns] 
+1

哇,谢谢!解决方案看似简单从来没有想过'to_datetime'会这样工作。我的原始数据出错了,但它与我测试过的一些简单数据一起工作。我会先看看我的原始数据。感谢您及时的回复。 – sndrosilva

2

基本上,你将需要使用pandas.to_datetimedatetime.timedelta

from datetime import timedelta 
df = pd.to_datetime(df['date']) + df['hour'].apply(lambda x: timedelta(hours=int(x))) 

说明:

from datetime import timedelta 
dft['date'] = pd.to_datetime(dft['date']) 
dft['hour_h'] = dft['hour'].apply(lambda x: timedelta(hours=int(x))) 
dff = dft['date']+dft['hour_h'] 

输出:

dff 
Out[42]: 
0 2015-01-01 01:00:00 
1 2015-01-01 02:00:00 
2 2015-01-01 03:00:00 
dtype: datetime64[ns] 
+0

感谢您的快速响应。我会试试这个。 – sndrosilva

+0

@ kobrakai,不客气。希望它有帮助,'datetime'是一个强大的软件包,用于处理所有日期时间问题,无论您是否使用'pandas'。 – MaThMaX

1

这是另一种方法:

In [224]: 
df['datetime'] = pd.to_datetime(df['date']) + pd.TimedeltaIndex(df['hour'], unit='h') 
df 

Out[224]: 
     date hour   datetime 
0 1/1/2015  1 2015-01-01 01:00:00 
1 1/1/2015  2 2015-01-01 02:00:00 
2 1/1/2015  3 2015-01-01 03:00:00 

这里的关键区别基本上是从小时列中构建一个TimedeltaIndex,并将其添加到转换后的datetime col结果to_datetime