计算每日发生的观测数量
我有一个用时间作为索引的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()
这个方法(我个人觉得这个方法比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
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'(求和)等等。