如何将包含日期时间的 DataFrame 列拆分为两列:一列包含日期,另一列包含一天中的时间?
Posted
技术标签:
【中文标题】如何将包含日期时间的 DataFrame 列拆分为两列:一列包含日期,另一列包含一天中的时间?【英文标题】:How can I split a DataFrame column with datetimes into two columns: one with dates and one with times of the day? 【发布时间】:2016-06-02 23:38:17 【问题描述】:我有一个名为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
【问题讨论】:
“日期”是什么类型的数据? df.Dates.iat[0] 的输出是什么? 【参考方案1】:如果你的系列是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
【讨论】:
您可以将时间列值保存为 12 小时格式而不是 24 小时格式吗??? @sanster9292 见this。 阿米,我不太擅长这个。我有一个看起来像这样的熊猫列中的数据。 1999-01-01T00:00:29.75 我想拆分并保存它和东部夏令时间。我将如何处理那里的T?这就是我目前正在做的事情, df3['Day']=pd.to_datetime(df['Date'], format='%Y-%m-%d %H:%M:%S.%f', errors='coerce').dt.tz_localize('UTC') @sanster9292 你能问这个问题吗?评论不适用于这些东西。很多人会帮助你。【参考方案2】:如果您的 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])
【讨论】:
【参考方案3】:如果Dates
的列类型为字符串,则将其转换为to_datetime
。然后你可以使用dt.date
、dt.time
和最后一个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
【讨论】:
【参考方案4】:
attrgetter
+ pd.concat
+ join
您可以使用operator.attrgetter
和pd.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
【讨论】:
以上是关于如何将包含日期时间的 DataFrame 列拆分为两列:一列包含日期,另一列包含一天中的时间?的主要内容,如果未能解决你的问题,请参考以下文章
Pandas Dataframe:如何将一列拆分为多个单热编码列[重复]
如何使用 Java 将 unix 纪元的列转换为 Apache spark DataFrame 中的日期?
将 Pandas DataFrame 中的日期对象列转换为字符串
(Oracle) SQL 中的正则表达式将日期/时间拆分为单独的日期和时间列