【问题标题】:Histogram of times from a CSV via Pandas通过 Pandas 的 CSV 时间直方图
【发布时间】:2015-06-23 09:12:27
【问题描述】:

我正在分析来自 CSV 的比赛结果,如下所示:

Position,Time,Race #,Batch,Name,Surname,Category,Sex,Age
1,00:25:04,58,E,Luke,Schlebusch,Junior,Male,17
2,00:25:16,92,E,Anrich,Zimmermann,Junior,Male,17
3,00:26:27,147,E,Ryan,Mathaba,Open,Male,33
4,00:26:58,53,E,Daniel,Rademan,Junior,Male,16
5,00:27:17,19,E,Werner,Du Preez,Open,Male,29
6,00:27:44,148,E,Mazu,Ndandani,Open,Male,37
7,00:27:45,42,E,Dakota,Murphy,Open,Male,20
8,00:28:29,56,E,David,Schlebusch,Master,Male,51
9,00:28:32,52,E,Caleb,Rademan,Minimee,Male,12

我正在使用以下对 read_csv 的调用将其解析为 Pandas 数据框:

race1 = pandas.read_csv('data.csv', parse_dates='Time', index_col='Time')

这使我能够非常轻松地绘制比赛时间的累积分布:

race1.Position.plot()

Pandas 处理所有复杂的日期数据类型,并通过正确的时间格式制作出漂亮的 x 轴。

有没有一种优雅的方式来获得同样简单的时间直方图?理想情况下,我希望能够做到race1.index.hist()race1.index.to_series().hist(),但我知道这行不通。

我已经能够将时间强制到timedelta 并获得工作结果

times = race1.index.to_series()
((times - times[0]).dt.seconds/60).hist()

这会生成正确形状的直方图,但显然 x 值错误(它们在最快的时间内关闭)。

是否有一种优雅的方法可以将列作为 timedelta 开始读取,是否有更好的方法来创建直方图,包括正确的刻度?此处正确的刻度表示他们使用correct locator 并正确更新。

【问题讨论】:

  • 也许可以尝试使用 pd.cut() 根据时间索引生成分类变量,然后为每个 bin 绘制条形图。 pd.cut() 将为您提供每个 bin 的适当时间戳范围,可以将其作为标签传递给绘图。

标签: python parsing pandas histogram timedelta


【解决方案1】:

这似乎工作得很好,虽然如果它没有通过 Matplotlib 日期细节关于序数日期,我会更高兴。

times = race1.index.to_series()
today = pandas.Timestamp('00:00:00')
timedelta = times - today
times_ordinal = timedelta.dt.seconds/(24*60*60) + today.toordinal()
ax = times_ordinal.hist()
ax.xaxis_date()
plt.gcf().autofmt_xdate()
plt.ylabel('Number of finishers')

【讨论】:

  • 除了您的好答案之外,您可能还想明确格式化 x-labels,以便它们不包含日期。即代替 ax.xaxis_date(),使用 ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M')) 或任何你喜欢的格式。
猜你喜欢
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 2015-01-07
  • 2022-11-25
  • 2017-05-11
  • 2016-04-21
相关资源
最近更新 更多