我想按时间对行进行分组,我尝试了以下方法
import pandas as pd
df = pd.DataFrame({'time': ["2001-01-01 10:20:30,000",
"2001-01-01 10:20:31,000",
"2001-01-02 5:00:00,000"],
'val': [1, 2, 3]})
t = pd.DatetimeIndex(df.time)
df = df.groupby([t.day, t.hour, t.minute]).count()生成的数据文件是
time val
time time time
1 10 20 2 2
2 5 0 1 1我期望的输出(或类似的输出):
time count
1 1-10-20 2
2 2-5-0 1我想要的情节:X-axis for minutes,Y-axis for count,按日+小时计算(比仅仅分钟更粗)。
问题:
1)为什么索引由3个time列组成,以及如何使索引只有一个包含1-10-20和2-5-0等元素的列
2)最好的做法是只使用count()结果的一列,而不是time和val的两列。
2)如何将这些数据(按天/小时/分钟分组)用滴答数来绘制?
发布于 2018-09-25 18:32:14
要回答你的第一个问题,是因为你被分成了三个不同的系列。如果你真的想把它们结合起来,用一个strftime分组
df.time = pd.to_datetime(df.time)
df.groupby([df.time.dt.strftime('%d-%H-%M')]).val.count()
time
01-10-20 2
02-05-00 1
Name: val, dtype: int64以上也回答了你的第二个问题。与其计算DataFrame,不如计算单个系列,即val系列。
最后,要绘图,可以使用pandas的内置pandas功能。我正在创建一个更复杂的示例来演示您想要的滴答:
r = pd.date_range(start='2001-01-01', freq='5T', periods=100)
df = pd.DataFrame({'time':r, 'val': np.random.randint(1, 10, 100)})
out = df.groupby([df.time.dt.strftime('%d-%H-%M')]).val.count().reset_index()
ax = out.assign(label=out.time.str[:5]).plot(x='label', y='val', kind='bar')
seen_ticks = set()
for idx, label in enumerate(ax.xaxis.get_ticklabels()):
if label.get_text() in seen_ticks:
label.set_visible(False)
else:
seen_ticks.add(label.get_text())
plt.tight_layout()
plt.show()这将只显示每分钟/小时唯一的x-滴答。

发布于 2018-09-25 18:28:49
1)使用pandas.DataFrame.from_dict(data)从字典中创建数据。(见dict.html)
这个问题还不完全清楚,但我认为你想要的是
df['time'] = pd.to_datetime(df['time'])
df.set_index('time', inplace=True)然后应用count()聚合。
( 3)这个问题我不太清楚。
https://stackoverflow.com/questions/52504329
复制相似问题