我有一个按时间索引的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))
但这并没有产生任何用处。
答案 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