【问题标题】:pandas datetime: groupy hourly and every monday熊猫日期时间:每小时和每周一
【发布时间】:2016-09-04 21:16:57
【问题描述】:
我是熊猫/python 的新手:
我有一个由datetime 对象索引的dataframe (events.number)。
我试图在每个星期一(或其他特定工作日)每小时提取一次事件计数。我写道:
hour_tally_monday = events.number.groupby(lambda x: (x.hour & x.weekday==0) ).count()
但这不能正常工作。
我可以删除“& x.weekday==1”,它可以工作,但可能会使用框架中的所有天数。什么是星期一平均的正确(最简单)语法?
【问题讨论】:
标签:
python
datetime
pandas
hour
weekday
【解决方案1】:
我认为您需要首先使用boolean indexing 过滤数据帧,然后使用groupby 和size:
import pandas as pd
start = pd.to_datetime('2016-02-01')
end = pd.to_datetime('2016-02-25')
rng = pd.date_range(start, end, freq='12H')
events = pd.DataFrame({'number': [1] * 20 + [2] * 15 + [3] * 14}, index=rng)
print events
number
2016-02-01 00:00:00 1
2016-02-01 12:00:00 1
2016-02-02 00:00:00 1
2016-02-02 12:00:00 1
2016-02-03 00:00:00 1
2016-02-03 12:00:00 1
2016-02-04 00:00:00 1
2016-02-04 12:00:00 1
2016-02-05 00:00:00 1
2016-02-05 12:00:00 1
2016-02-06 00:00:00 1
2016-02-06 12:00:00 1
2016-02-07 00:00:00 1
...
...
filtered = events[events.index.weekday == 0]
print filtered
number
2016-02-01 00:00:00 1
2016-02-01 12:00:00 1
2016-02-08 00:00:00 1
2016-02-08 12:00:00 1
2016-02-15 00:00:00 2
2016-02-15 12:00:00 2
2016-02-22 00:00:00 3
2016-02-22 12:00:00 3
在0.18.1 版本中,您可以使用新方法DatetimeIndex.weekday_name:
filtered = events[events.index.weekday_name == 'Monday']
print filtered
number
2016-02-01 00:00:00 1
2016-02-01 12:00:00 1
2016-02-08 00:00:00 1
2016-02-08 12:00:00 1
2016-02-15 00:00:00 2
2016-02-15 12:00:00 2
2016-02-22 00:00:00 3
2016-02-22 12:00:00 3
print filtered.groupby(filtered.index.hour).size()
0 4
12 4
dtype: int64