熊猫: 从日期栏直接返回一小时

假设我有一个时间戳值的 DataFrame 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_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

我希望 喜欢实现的是一些类似下面这样的较短的转换(我知道这是错误的,但是从精神上来说是正确的) :

sales['time_hour'] = sales['timestamp'].hour

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

有没有更直接的方法?

169010 次浏览

你可以使用 Lambda 表达式,例如:

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

假设时间戳是数据框架的索引,您只需执行以下操作:

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


对于后代: 对于 0.15.0,有一个方便的 . dt 访问器,您可以使用它从日期时间/周期序列中提取这些值(在上面的例子中,只需 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)

您还可以创建一个函数,如果需要,还可以提取月份、年份等信息,但是必须以“时间戳”作为索引。

for i in range(len(sales)):
position = sales.index[i]
hour = position.hour
month = position.month
sales.loc[position, 'hour'] = hour
sales.loc[position, 'month'] = month