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:直接从日期时间列返回小时的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas:将日期时间列分组为小时和分钟聚合