Pandas:直接从日期时间列返回小时

Posted

技术标签:

【中文标题】Pandas:直接从日期时间列返回小时【英文标题】:Pandas: Return Hour from Datetime Column Directly 【发布时间】:2014-09-27 13:04:02 【问题描述】:

假设我有一个时间戳值的 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,因此没有这些属性,但似乎有一种更简单的方法来利用矩阵运算。

有没有更直接的方法?

【问题讨论】:

pd.Datetimeindex(sales['timestamp']).hour 将比使用 .apply 快得多 这就是我要走的路。我正在寻找一种使用pd.to_datetime 迭代地将这些列转换为类似日期时间索引的对象的方法。但是整个列本身需要是一个 datetimeindex 对象,这不是用pd.to_datetime 实现的。 您也可以使用pd.to_datetime(column.values,box=True) 来执行此操作(我认为有时会添加一个Series.to_index() 方法来基本上直接执行此操作。这都是矢量化的。 @JohnE 不确定你在说什么 @Jeff -- Datetimeindex 应该是 DatetimeIndex,对吧? (索引中的大写 I) 【参考方案1】:

假设时间戳是数据帧的索引,你可以这样做:

hours = sales.index.hour

如果您想将其添加到您的销售数据框中,只需执行以下操作:

import pandas as pd
pd.concat([sales, pd.DataFrame(hours, index=sales.index)], axis = 1)

编辑: 如果您有几列日期时间对象,则过程相同。如果您的数据框中有一列 ['date'],并假设 'date' 具有日期时间值,则可以从 'date' 访问小时:

hours = sales['date'].hour

编辑2: 如果要调整数据框中的列,则必须包含 dt

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

【讨论】:

不幸的是,我的示例设置得很差。我的实际难题包括几列datetime 值。我将计算时间戳之间经过的营业时间,因此将提取几组小时单位值。 假设 'date' 是一个列 hours = sales['date'].hour1 将给出属性错误:AttributeError: 'Series' object has no attribute 'hour' @Lucas 对,如果是列,那么答案是 hours=sales['date'].dt.hour @famargar 非常感谢您添加 dt 拯救我的生命。 dt btw 是什么意思? @overloading 大概是datetime的缩写【参考方案2】:

对于后代:截至0.15.0,有一个方便的.dt accessor,您可以使用它从日期时间/周期系列中提取此类值(在上述情况下,只需sales.timestamp.dt.hour

【讨论】:

提供的链接对我不起作用。这个是.dt accessor。【参考方案3】:

您可以使用lambda expression,例如:

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

【讨论】:

这很有帮助,特别是如果事实证明无法使用apply() 确实是这样但是比使用sales.timestamp.dt.hour慢,写起来也慢【参考方案4】:

你可以试试这个:

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

【讨论】:

【参考方案5】:

由于最快、最短的答案在评论中(来自 Jeff)并且有错字,因此在此更正完整:

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

【讨论】:

【参考方案6】:

现在我们可以使用:

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

【讨论】:

【参考方案7】:

这是一个简单的解决方案:

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

以上是关于Pandas:直接从日期时间列返回小时的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 日期时间列中标记夏令时 (DST) 小时

Python Pandas:将日期时间列分组为小时和分钟聚合

有没有办法用两个日期之间的每小时日期时间有效地填充 python 中的 pandas df 列?

pandas如何去掉时间列的小时只保留日期

mysql 计算两个日期的时间差函数小时分钟格式

如何将具有 24 小时值的日期/时间字符串转换为 Pandas 中的日期时间?