Python Pandas:直接从Datetime列返回小时

Python Pandas:直接从Datetime列返回小时,python,datetime,pandas,Python,Datetime,Pandas,假设我有一个时间戳值的数据帧sales: timestamp sales_office 2014-01-01 09:01:00 Cincinnati 2014-01-01 09:11:00 San Francisco 2014-01-01 15:22:00 Chicago 2014-01-01 19:01:00 Chicago 我想创建一个新列time\u hour。我可以通过编写一个简短的函数来创建它,并使用apply()迭代地应用

假设我有一个时间戳值的数据帧
sales

timestamp               sales_office
2014-01-01 09:01:00     Cincinnati
2014-01-01 09:11:00     San Francisco
2014-01-01 15:22:00     Chicago
2014-01-01 19:01:00     Chicago
我想创建一个新列
time\u hour
。我可以通过编写一个简短的函数来创建它,并使用
apply()
迭代地应用它:

def hr_func(ts):
    return ts.hour

sales['time_hour'] = sales['timestamp'].apply(hr_func)
然后我会看到这个结果:

timestamp               sales_office         time_hour
2014-01-01 09:01:00     Cincinnati           9
2014-01-01 09:11:00     San Francisco        9
2014-01-01 15:22:00     Chicago              15
2014-01-01 19:01:00     Chicago              19
我想实现的是这样的一些较短的转换(我知道这是错误的,但得到了精神):

显然,列的类型是
Series
,因此没有这些属性,但似乎有一种更简单的方法来使用矩阵运算

有更直接的方法吗?

您可以使用,例如:


假设timestamp是数据帧的索引,则只需执行以下操作:

hours = sales.index.hour
如果要将其添加到销售数据框中,只需执行以下操作:

import pandas as pd
pd.concat([sales, pd.DataFrame(hours, index=sales.index)], axis = 1)
编辑: 如果有几列datetime对象,则是同一个过程。如果您的数据框中有一列['date'],并且假设'date'具有datetime值,则可以访问从'date'开始的小时,如下所示:

hours = sales['date'].hour
编辑2: 如果要调整数据框中的列,必须包括
dt

sales['datehour'] = sales['date'].dt.hour

对于后代:截至,您可以使用一个方便的工具从datetime/period系列中提取此类值(在上述情况下,只需
sales.timestamp.dt.hour

您可以尝试以下方法:

sales['time_hour'] = pd.to_datetime(sales['timestamp']).dt.hour

以下是一个简单的解决方案:

import pandas as pd
# convert the timestamp column to datetime
df['timestamp'] = pd.to_datetime(df['timestamp'])

# extract hour from the timestamp column to create an time_hour column
df['time_hour'] = df['timestamp'].dt.hour

由于最快、最短的答案是一条评论(来自Jeff),并且有一个打字错误,因此在这里它被更正并完整:

sales['time_hour'] = pd.DatetimeIndex(sales['timestamp']).hour
现在我们可以使用:

sales['time_hour'] = sales['timestamp'].apply(lambda x: x.hour)

这非常有帮助,尤其是在无法使用
apply()的情况下
。这是真的,但它比使用sales.timestamp.dt.hour慢,而且写起来也慢。不幸的是,我的示例设置得不好。我的实际难题包括几列
datetime
值。我将计算时间戳之间经过的营业时间,因此将提取几组小时单位值s、 假设'date'是一列
hours=sales['date']。hour1
将给出一个属性错误:
AttributeError:'Series'对象没有属性'hour'

@Lucas right,如果它是一列,那么答案将是hours=sales['date']怀特先生。hour@famargar非常感谢您添加dt拯救我的生命。顺便问一下,dt的含义是什么?@重载可能是
datetime
pd.Datetimeindex(sales['timestamp')的缩写).hour
将比使用
快得多。apply
这是我将采用的方法。我正在寻找一种方法,使用
pd.to\u datetime
迭代地将这些列转换为类似datetimeindex的对象。但是整个列本身需要是datetimeindex对象,这不是使用
pd.to\u datetime
实现的。您可以这样做使用
pd.to\u datetime(column.values,box=True)
以及(我认为会添加一个
Series.to\u index()
方法来直接执行此操作。这都是矢量化的。@JohnE不确定您在说什么about@Jeff--
Datetimeindex
应该是
Datetimeindex
,对吗?(索引中的大写I)提供的链接对我不起作用。这一个起作用了。
sales['time_hour'] = pd.DatetimeIndex(sales['timestamp']).hour
sales['time_hour'] = sales['timestamp'].apply(lambda x: x.hour)