首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫DataFrame和DateTimeIndex

熊猫DataFrame和DateTimeIndex
EN

Stack Overflow用户
提问于 2018-09-25 18:07:06
回答 2查看 104关注 0票数 0

我想按时间对行进行分组,我尝试了以下方法

代码语言:javascript
复制
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()

生成的数据文件是

代码语言:javascript
复制
                   time val
    time time time      
       1   10   20    2   2
       2    5    0    1   1

我期望的输出(或类似的输出):

代码语言:javascript
复制
           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-202-5-0等元素的列

2)最好的做法是只使用count()结果的一列,而不是timeval的两列。

2)如何将这些数据(按天/小时/分钟分组)用滴答数来绘制?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-25 18:32:14

要回答你的第一个问题,是因为你被分成了三个不同的系列。如果你真的想把它们结合起来,用一个strftime分组

代码语言:javascript
复制
df.time = pd.to_datetime(df.time)

df.groupby([df.time.dt.strftime('%d-%H-%M')]).val.count()

代码语言:javascript
复制
time
01-10-20    2
02-05-00    1
Name: val, dtype: int64

以上也回答了你的第二个问题。与其计算DataFrame,不如计算单个系列,即val系列。

最后,要绘图,可以使用pandas的内置pandas功能。我正在创建一个更复杂的示例来演示您想要的滴答:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-09-25 18:28:49

1)使用pandas.DataFrame.from_dict(data)从字典中创建数据。(见dict.html)

这个问题还不完全清楚,但我认为你想要的是

代码语言:javascript
复制
df['time'] = pd.to_datetime(df['time'])
df.set_index('time', inplace=True)

然后应用count()聚合。

( 3)这个问题我不太清楚。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52504329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档