计算每日发生的观测数量

3 投票
4 回答
3929 浏览
提问于 2025-04-18 05:45

我有一个用时间作为索引的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

我对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=...那一行,但看起来不太可靠。

0

正如exp1orer提到的,你需要把字符串格式的日期转换成日期格式。或者如果你只是想统计数量,不在乎日期格式的话,可以直接取date列的前10个字符。然后使用value_counts()这个方法(我个人觉得这个方法比groupbysum更简单,适合用来做这种简单的数量统计)。

你可以用一行代码就实现你需要的功能:

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
1

哇,@Jeff 赢了:

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

我最差的回答:

第一个问题是你的日期列是字符串,而不是日期时间。可以使用来自 这个讨论帖 的代码:

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

然后这就简单了,你的想法是对的:

grouped = df.groupby(df['date'].apply(lambda x: x.date()))
grouped['value'].count()
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'(计数)和 'sum'(求和)等等。

撰写回答