【问题标题】:Pandas DataFrame and DateTimeIndexPandas DataFrame 和 DateTimeIndex
【发布时间】:2018-09-25 18:07:06
【问题描述】:

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

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 代表分钟,Y-axis 代表count,按天+小时(比分钟更粗)。

问题:

1) 为什么索引由 3 个 time 列组成,我怎样才能让索引只包含一个包含 1-10-202-5-0 等元素的列?

2) 只有一列结果为count() 而不是两列timeval 的最佳做法是什么?

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

【问题讨论】:

  • 鉴于您提供的示例,您期望的输出是什么?
  • 你能澄清一下你想要的情节吗?其他两个问题更容易
  • @user3483203 我更新了问题。

标签: python pandas datetime


【解决方案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 系列。


最后,要进行绘图,您可以使用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-ticks

【讨论】:

  • 非常感谢您的回答!您能否澄清一下我如何才能有日/小时/分钟的垃圾箱,但只为日/小时(粗略)打勾,因为有很多垃圾箱。
  • 不幸的是,我不知道这意味着什么。如果您可以展示一个演示该概念的示例图,我可以更新答案
  • 每小时有 60 个点并且有多个小时。我希望所有数据点(每分钟)都出现在图表上,但 X 轴上的刻度应该只显示天/小时,而不是分钟。所以滴答声比数据点少得多。
  • 类似 pandas.pydata.org/pandas-docs/stable/_images/… 的东西,但有几天/几小时的刻度。
  • @Konstantin 展示了一种减少 x-ticks 的方法
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-05
    • 2021-12-26
    • 2019-06-22
    • 2020-01-04
    • 2020-02-15
    • 1970-01-01
    • 2021-05-20
    相关资源
    最近更新 更多