Python 熊猫:将日期和时间合并到一个datetime列中

Python 熊猫:将日期和时间合并到一个datetime列中,python,pandas,datetime,Python,Pandas,Datetime,我有一个13列的数据框,其中两列是日期和时间 我想 1加入日期和时间以及 2正确格式化结果DD.MM.YYYY HH:MM:SS Date Time 0 2012-09-27 00:40:20 1 2012-09-27 07:24:37 2 2012-09-27 07:25:08 3 2012-09-27 07:43:48 4 2012-09-27 07:44:27 5 2012-09-27 07:55:16 6 2012-09-27

我有一个13列的数据框,其中两列是日期和时间

我想 1加入日期和时间以及 2正确格式化结果DD.MM.YYYY HH:MM:SS

        Date    Time
0   2012-09-27  00:40:20
1   2012-09-27  07:24:37
2   2012-09-27  07:25:08
3   2012-09-27  07:43:48
4   2012-09-27  07:44:27
5   2012-09-27  07:55:16
6   2012-09-27  08:04:19
7   2012-09-27  08:08:21
8   2012-09-27  08:09:08
9   2012-09-27  08:15:30
10  2012-09-27  08:15:35
>#dt.strptime(f, '%Y-%m-%d %H:%M:%S')
TypeError: strptime() argument 1 must be str, not Series
所以我试着:

>type(df["Date"])
pandas.core.series.Series
我在想,为什么不把它们都转换成字符串表示形式,并以这种方式操作它们呢

>g = df["Time"].astype(str)
>type(g)
pandas.core.series.Series
什么?!还是连续剧

所以我试着去创造:

>f = df["Date"].astype(str) + " " + df["Time"].astype(str)
>f
0     2012-09-27 00:40:20
1     2012-09-27 07:24:37
2     2012-09-27 07:25:08
3     2012-09-27 07:43:48
嘿!真管用!不,我们只需要正确的格式DD.MM.YYYY HH:MM:SS

        Date    Time
0   2012-09-27  00:40:20
1   2012-09-27  07:24:37
2   2012-09-27  07:25:08
3   2012-09-27  07:43:48
4   2012-09-27  07:44:27
5   2012-09-27  07:55:16
6   2012-09-27  08:04:19
7   2012-09-27  08:08:21
8   2012-09-27  08:09:08
9   2012-09-27  08:15:30
10  2012-09-27  08:15:35
>#dt.strptime(f, '%Y-%m-%d %H:%M:%S')
TypeError: strptime() argument 1 must be str, not Series
仍然是一个系列…嗯…显然它不会让自己被转换。我们试试别的吧

>f = p.concat([df["Date"], df["Time"]], axis=1)
>f
        Date    Time
0   2012-09-27  00:40:20
1   2012-09-27  07:24:37
2   2012-09-27  07:25:08
很好!但是这两个专栏不是还

>f.shape
(100,2)
对……回到原点

我没有主意了

有人吗?

.astypestr处理序列的元素,而不是序列本身,因此当然是typedf[Time].astypestr==pd.Series。这似乎是你大部分困惑的根源,你是根据这部剧而不是它的元素来行动的

其中一个解决方案可能是一种更简单的方法,即在序列上循环:

dts = [datetime.datetime.strptime(elem, '%Y-%m-%d%H:%M:%S') 
       for elem in df['Date'] + df['Time']]

fmted = [elem.strftime('%d-%m-%Y %H:%M:%S') for elem in dts]

df.insert(0, 'DateTime', fmted)
.astypestr作用于序列的元素,而不是序列本身,因此当然typedf[Time].astypestr==pd.Series。这似乎是你大部分困惑的根源,你是根据这部剧而不是它的元素来行动的

其中一个解决方案可能是一种更简单的方法,即在序列上循环:

dts = [datetime.datetime.strptime(elem, '%Y-%m-%d%H:%M:%S') 
       for elem in df['Date'] + df['Time']]

fmted = [elem.strftime('%d-%m-%Y %H:%M:%S') for elem in dts]

df.insert(0, 'DateTime', fmted)

这些列可以合并并分配给数据框中的新列或现有列:

df['datetime'] = df['dates'] + " " + df['time']
输出示例:

        dates      time             datetime
0  2012-09-27  00:40:20  2012-09-27 00:40:20
1  2012-09-27  07:24:37  2012-09-27 07:24:37
2  2012-09-27  07:25:08  2012-09-27 07:25:08

这些列可以合并并分配给数据框中的新列或现有列:

df['datetime'] = df['dates'] + " " + df['time']
输出示例:

        dates      time             datetime
0  2012-09-27  00:40:20  2012-09-27 00:40:20
1  2012-09-27  07:24:37  2012-09-27 07:24:37
2  2012-09-27  07:25:08  2012-09-27 07:25:08

我认为您需要使用以下内容连接列:

如果有带时间的datetime:

print (type(df.loc[0, 'Date']))
<class 'datetime.date'>

print (type(df.loc[0, 'Time']))
<class 'datetime.time'>

df['datetime'] = pd.to_datetime(df["Date"].astype(str) + " " + df["Time"].astype(str))

我认为您需要使用以下内容连接列:

如果有带时间的datetime:

print (type(df.loc[0, 'Date']))
<class 'datetime.date'>

print (type(df.loc[0, 'Time']))
<class 'datetime.time'>

df['datetime'] = pd.to_datetime(df["Date"].astype(str) + " " + df["Time"].astype(str))

我使用了您的实现,现在它可以工作了。谢谢您的实现也满足了我所追求的格式。我使用了您的实现,现在它可以工作了。谢谢您的实现也满足了我所追求的格式。奇怪的是,这无法更有效地解决。但无论如何,谢谢你们所有人的回答。奇怪的是,这个问题无法得到更有效的解决。但无论如何,谢谢你们的回答。