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

Dan*_*ack 40 python datetime pandas

假设我有一个sales时间戳值的DataFrame :

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
Run Code Online (Sandbox Code Playgroud)

我想创建一个新列time_hour.我可以通过编写一个简短的函数来创建它,并使用apply()迭代应用它:

def hr_func(ts):
    return ts.hour

sales['time_hour'] = sales['timestamp'].apply(hr_func)
Run Code Online (Sandbox Code Playgroud)

然后我会看到这个结果:

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
Run Code Online (Sandbox Code Playgroud)

什么我实现的是这样一些较短的转变(我知道是错误的,但在精神得到):

sales['time_hour'] = sales['timestamp'].hour
Run Code Online (Sandbox Code Playgroud)

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

有更直接的方法吗?

iff*_*_or 37

对于后代:从0.15.0开始,有一个方便的.dt访问器,你可以用来从日期时间/期间系列中提取这些值(在上面的例子中,只是sales.timestamp.dt.hour!


Sud*_*sak 25

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

    hours = sales.index.hour
Run Code Online (Sandbox Code Playgroud)

如果要将其添加到销售数据框中,请执行此操作

    import pandas as pd
    pd.concat([sales, pd.DataFrame(hours, index=sales.index)], axis = 1)
Run Code Online (Sandbox Code Playgroud)

编辑:如果您有多列datetime对象,则其过程相同.如果数据框中有一列['date'],并假设'date'具有datetime值,则可以从'date'访问小时:

    hours = sales['date'].hour
Run Code Online (Sandbox Code Playgroud)

  • 假设'date'是一列`hours = sales ['date'].hour1`将给出一个属性错误:`AttributeError:'Series'对象没有属性'hour'`<br/> (16认同)
  • @Lucas对,如果它是一列,那么答案就是小时=销售['日期'] .dt.hour (16认同)

小智 12

您可以使用lambda表达式,例如:

sales['time_hour'] = sales.timestamp.apply(lambda x: x.hour)
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以尝试以下方法:

sales['time_hour'] = pd.to_datetime(sales['timestamp']).dt.hour
Run Code Online (Sandbox Code Playgroud)