python itertools.groupby datetime系列按小时

时间:2018-12-06 19:02:44

标签: python python-3.x

任务非常简单,我可以部分完成它:

from dateutil.parser import parse

    for timestamp, grp in itertools.groupby(transactions, lambda x: parse(x['date']).hour):
        group = list(grp)
        logger.info(f'{timestamp} : {len(group)}')

->我得到了hour:count数组。

但是我想要一个datetime:count数组作为结果(其中datetime对象代表一个小时)。

我是否必须在datetime函数中构建lambda x对象? (即获取x['date']).hourx['date']).dayx['date']).month等,并使用这些值创建新的datetime)还是有另一种方法?

样本输入(交易)包含数周/数月的数据:

[
 {
  'date': '2018-12-04T15:34:40+00:00',
  'data': 'blabla'
 },
 {
  'date': '2018-12-04T15:38:40+00:00',
  'data': 'blabla'
 },
 {
  'date': '2018-12-04T15:45:40+00:00',
  'data': 'blabla'
 },
]

示例输出:

2018-12-04 13:00:00+00:00 : 6
2018-12-04 14:00:00+00:00 : 1
2018-12-04 15:00:00+00:00 : 2

谢谢

2 个答案:

答案 0 :(得分:1)

您需要使用datetime对象作为键,我现在使用它作为日期,但是您可以使用原始日期:

"\n"

输出

startActivityForResult()

答案 1 :(得分:0)

由于我是MergeThis的粉丝,所以:

In [42]: right
Out[42]:
   C  D MergeThis
0  1  2       +N2
1  3  4       +N2
2  5  6       +N2
3  7  8       +N2

In [43]: left
Out[43]:
    A   B MergeThis
0   1   2       -N2
1   3   4       -N2
2   5   6       +N2
3   7   8       +N2
4   9  10       +N2
5  11  12       +N2

In [44]: right.index = left[left.MergeThis == '+N2'].index.values

In [45]: right
Out[45]:
   C  D MergeThis
2  1  2       +N2
3  3  4       +N2
4  5  6       +N2
5  7  8       +N2

In [46]: pandas.concat([left, right], axis=1)
Out[46]:
    A   B MergeThis    C    D MergeThis
0   1   2       -N2  NaN  NaN       NaN
1   3   4       -N2  NaN  NaN       NaN
2   5   6       +N2  1.0  2.0       +N2
3   7   8       +N2  3.0  4.0       +N2
4   9  10       +N2  5.0  6.0       +N2
5  11  12       +N2  7.0  8.0       +N2

这是使用列表理解的解决方案:

collections.Counter