【问题标题】:in pandas how can I groupby weekday() for a datetime column?在熊猫中,我如何按工作日()分组日期时间列?
【发布时间】:2012-12-06 09:36:35
【问题描述】:

我想过滤掉周末数据,只查看工作日的数据 (mon(0)-fri(4))。我是 pandas 的新手,在 pandas 中完成此任务的最佳方法是什么?

import datetime
from pandas import *

data = read_csv("data.csv")
data.my_dt 

Out[52]:
0     2012-10-01 02:00:39
1     2012-10-01 02:00:38
2     2012-10-01 02:01:05
3     2012-10-01 02:01:07
4     2012-10-01 02:02:03
5     2012-10-01 02:02:09
6     2012-10-01 02:02:03
7     2012-10-01 02:02:35
8     2012-10-01 02:02:33
9     2012-10-01 02:03:01
10    2012-10-01 02:08:53
11    2012-10-01 02:09:04
12    2012-10-01 02:09:09
13    2012-10-01 02:10:20
14    2012-10-01 02:10:45
...

我想做这样的事情:

weekdays_only = data[data.my_dt.weekday() < 5]

AttributeError: 'numpy.int64' 对象没有属性 'weekday'

但这不起作用,我还没有完全掌握如何访问列日期时间对象。

最终目标是按工作日的时间范围分层排列,例如:

monday, 0-6, 7-12, 13-18, 19-23
tuesday, 0-6, 7-12, 13-18, 19-23

【问题讨论】:

  • 不确定您的用例,但通常您会使用my_dt 作为索引,通过将parse_dates=Trueindex_col=&lt;my_dt col&gt; 作为关键字参数传递给read_csvread_csv 将返回一个@ 987654329@。然后你可以简单地做weekdays = data[data.index.weekday &lt; 5]

标签: python pandas


【解决方案1】:

您对函数“weekday”的调用不起作用,因为它对 data.my_dt 的索引进行操作,该索引是一个 int64 数组(这是错误消息的来源)

您可以使用以下内容在包含工作日的数据中创建一个新列:

data['weekday'] = data['my_dt'].apply(lambda x: x.weekday())

然后您可以使用以下方法过滤工作日:

weekdays_only = data[data['weekday'] < 5 ]

希望对你有帮助

【讨论】:

  • 太棒了!就可以了……好吧,我还注意到 data.my_dt.map() 可以用来做同样的事情。你知道使用 .map() 和 .apply() 的区别吗?
  • 在这种情况下它们是等价的。 Apply 还可以做聚合等事情
【解决方案2】:

更快的方法是使用DatetimeIndex.weekday,如下所示:

temp = pd.DatetimeIndex(data['my_dt'])
data['weekday'] = temp.weekday

快得多,尤其是对于大量行。如需更多信息,请查看this 答案。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
  • 2013-10-26
  • 2020-02-21
相关资源
最近更新 更多