熊猫DataFrame和DateTimeIndex

时间:2018-09-25 18:07:07

标签: python pandas datetime

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

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-202-5-0这样的元素的索引列呢?

2)最好的做法是仅使一列具有count()的结果,而不是两列timeval

2)我该如何绘制这些数据(按天/小时/分钟分组),并以天和小时为刻度?

2 个答案:

答案 0 :(得分:1)

要回答第一个问题,是因为您要按三个单独的系列分组。如果您确实希望将它们合并,请按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系列。


最后,要进行绘制,可以使用plot的内置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标记

enter image description here

答案 1 :(得分:0)

1)使用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)我不清楚这个问题。