计算每天发生的观察次数

时间:2014-05-08 00:20:56

标签: python pandas

我有一个按时间索引的pandas数据帧。我想知道每天发生的观察总数(即数据帧行)。

这是我的数据框:

import pandas as pd

data = {'date': ['2014-05-01 18:47:05.069722', '2014-05-01 18:47:05.119994', '2014-05-02 18:47:05.178768', '2014-05-02 18:47:05.230071', '2014-05-02 18:47:05.230071', '2014-05-02 18:47:05.280592', '2014-05-03 18:47:05.332662', '2014-05-03 18:47:05.385109', '2014-05-04 18:47:05.436523', '2014-05-04 18:47:05.486877'], 
        'value': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
df = pd.DataFrame(data, columns = ['date', 'value'])
print(df)

我想要的是一个如下所示的数据框(或系列):

   date             value
0  2014-05-01       2
1  2014-05-02       3
2  2014-05-03       2
3  2014-05-04       2

在达到一堆StackOverflow问题后,我能得到的最接近的是:

df['date'].groupby(df.index.map(lambda t: t.day))

但这并没有产生任何用处。

4 个答案:

答案 0 :(得分:6)

使用重新取样。您需要将日期列设置为日期时间数据类型(因为它们是字符串),并且您需要将其设置为使用重新采样的索引。

In [13]: df['date'] = pd.to_datetime(df['date'])

In [14]: df.set_index('date').resample('D', 'count')
Out[14]: 
            value
date             
2014-05-01      2
2014-05-02      4
2014-05-03      2
2014-05-04      2

您可以使用任意函数或内置的便利函数作为字符串,包括' count'和'总和'等

答案 1 :(得分:0)

哇,@杰夫胜:

df.resample('D',how='count')

我的答案更糟:

第一个问题是你的日期列是字符串,而不是日期时间。使用this thread中的代码:

import dateutil
df['date'] = df['date'].apply(dateutil.parser.parse)

然后它是微不足道的,你有正确的想法:

grouped = df.groupby(df['date'].apply(lambda x: x.date()))
grouped['value'].count()

答案 2 :(得分:0)

我知道没有关于pandas,但在Python中你可以做类似的事情:

data = {'date': ['2014-05-01 18:47:05.069722', '2014-05-01 18:47:05.119994', '2014-05-02 18:47:05.178768', '2014-05-02 18:47:05.230071', '2014-05-02 18:47:05.230071', '2014-05-02 18:47:05.280592', '2014-05-03 18:47:05.332662', '2014-05-03 18:47:05.385109', '2014-05-04 18:47:05.436523', '2014-05-04 18:47:05.486877'],
        'value': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}

import datetime
dates = [datetime.datetime.strptime(ts, '%Y-%m-%d %H:%M:%S.%f').strftime('%Y-%m-%d') for ts in data['date']]

cnt = {}
for d in dates: cnt[d] = (cnt.get(d) or 0) + 1

for i, k in enumerate(sorted(cnt)):
    print("%d  %s  %d" % (i,k,cnt[k]))

哪个会输出:

0  2014-05-01  2
1  2014-05-02  4
2  2014-05-03  2
3  2014-05-04  2

如果您不关心解析和重新格式化日期时间字符串,我想类似

dates = [d[0:10] for d in data['date']]

可以替换较长的dates=...行,但似乎不太健壮。

答案 3 :(得分:0)

正如exp1orer提到的那样,你需要将字符串日期转换为日期格式。或者,如果您只想计算盲点但不关心日期格式,则可以使用date列的前10个字符。然后使用value_counts()方法(就我个人而言,我更喜欢groupby + sum这个简单的数据。

您可以通过一个班轮来满足您的需求:

In [93]: df.date.str[:10].value_counts()
Out[93]: 
2014-05-02    4
2014-05-04    2
2014-05-01    2
2014-05-03    2
dtype: int64