如何将带有日期时间的 DataFrame 列拆分为两列:一列包含日期,另一列包含一天中的时间?

How can I split a DataFrame column with datetimes into two columns: one with dates and one with times of the day?

我有一个名为 data 的数据框,其中有一列 Dates 像这样,

                 Dates
0  2015-05-13 23:53:00
1  2015-05-13 23:53:00
2  2015-05-13 23:33:00
3  2015-05-13 23:30:00
4  2015-05-13 23:30:00

我知道如何向数据框添加一列,但如何将 Dates 划分为

          Day         Time
0  2015-05-13     23:53:00
1  2015-05-13     23:53:00
2  2015-05-13     23:33:00
3  2015-05-13     23:30:00
4  2015-05-13     23:30:00

如果你的系列是s,那么这将创建这样一个DataFrame:

pd.DataFrame({
    'date': pd.to_datetime(s).dt.date,
    'time': pd.to_datetime(s).dt.time})

因为一旦你使用 pd.to_datetime 转换系列,那么 dt 成员就可以用来提取部分。


例子

import pandas as pd

s = pd.Series(['2015-05-13 23:53:00', '2015-05-13 23:53:00'])
>>> pd.DataFrame({
    'date': pd.to_datetime(s).dt.date,
    'time': pd.to_datetime(s).dt.time})
    date    time
0   2015-05-13  23:53:00
1   2015-05-13  23:53:00

如果您的 Dates 列是字符串:

data['Day'], data['Time'] = zip(*data.Dates.str.split())

>>> data
                 Dates         Day      Time
0  2015-05-13 23:53:00  2015-05-13  23:53:00
1  2015-05-13 23:53:00  2015-05-13  23:53:00
2  2015-05-13 23:33:00  2015-05-13  23:33:00
3  2015-05-13 23:33:00  2015-05-13  23:33:00
4  2015-05-13 23:33:00  2015-05-13  23:33:00

如果是时间戳:

data['Day'], data['Time'] = zip(*[(d.date(), d.time()) for d in data.Dates])

如果列 Dates 的类型是字符串,则按 to_datetime. Then you can use dt.date, dt.time and last drop 原始列 Dates:

转换
print df['Dates'].dtypes
object
print type(df.at[0, 'Dates'])
<type 'str'>

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

print df['Dates'].dtypes
datetime64[ns]

print df
                Dates
0 2015-05-13 23:53:00
1 2015-05-13 23:53:00
2 2015-05-13 23:33:00
3 2015-05-13 23:30:00
4 2015-05-13 23:30:00

df['Date'] = df['Dates'].dt.date
df['Time'] = df['Dates'].dt.time

df = df.drop('Dates', axis=1)
print df
         Date      Time
0  2015-05-13  23:53:00
1  2015-05-13  23:53:00
2  2015-05-13  23:33:00
3  2015-05-13  23:30:00
4  2015-05-13  23:30:00

attrgetter + pd.concat + join

您可以使用 operator.attrgetterpd.concat 将任意数量的 datetime 属性作为单独的系列添加到您的数据框:

from operator import attrgetter

fields = ['date', 'time']
df = df.join(pd.concat(attrgetter(*fields)(df['Date'].dt), axis=1, keys=fields))

print(df)

                 Date        date      time
0 2015-05-13 23:53:00  2015-05-13  23:53:00
1 2015-01-13 15:23:00  2015-01-13  15:23:00
2 2016-01-13 03:33:00  2016-01-13  03:33:00
3 2018-02-13 20:13:25  2018-02-13  20:13:25
4 2017-05-12 06:52:00  2017-05-12  06:52:00