[英]Pandas DataFrame and DateTimeIndex
我想按时间对行进行分组,我尝试了以下方法
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
轴表示分钟, Y
轴表示count
,按天+小时滴答(不只是分钟)。
问题:
1)为什么索引由3个time
列组成,我如何只有一个包含1-10-20
和2-5-0
这样的元素的索引列?
2)最好的做法是只有一列具有count()
的结果,而不是两列time
和val
?
2)如何以天和小时为单位绘制此数据(按天/小时/分钟分组)?
要回答第一个问题,是因为您要按三个单独的系列分组。 如果您真的希望将它们组合在一起,请按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
的内置plot
功能。 我正在创建一个更复杂的示例来演示您想要的报价:
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标记
1)使用pandas.DataFrame.from_dict(data)
从字典创建数据pandas.DataFrame.from_dict(data)
。 (请参阅https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.from_dict.html )
2)这个问题尚不完全清楚,但我认为您想要的是
df['time'] = pd.to_datetime(df['time'])
df.set_index('time', inplace=True)
然后应用count()
聚合。
3)这个问题我不清楚。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.