如何从日期时间格式的数据在轴中添加每小时刻度

Posted

技术标签:

【中文标题】如何从日期时间格式的数据在轴中添加每小时刻度【英文标题】:How to add hourly ticks in an axis from datetime formatted data 【发布时间】:2021-12-16 18:18:20 【问题描述】:

我有一个每日温度随时间变化的数据框

time    temp    temp_mean
00:01:51.57 185.94  185.94
00:01:52.54 187.48  186.71
00:01:53.51 197.85  190.4233333
00:01:54.49 195.71  191.745
00:01:55.46 197.22  192.84
00:01:56.43 187.33  191.9216667
00:01:57.41 194.18  192.2442857
00:01:58.38 199.9   193.20125
00:01:59.35 184.23  192.2044444
00:02:00.33 201.34  193.118
00:02:01.30 200.12  193.7545455
00:02:02.27 199.13  194.2025
00:02:03.24 187.47  193.6846154
00:02:04.22 187.65  193.2535714
00:02:05.19 195.59  193.4093333
00:02:06.17 188.7   193.115
00:02:07.14 196.16  193.2941176
00:02:08.11 191.17  193.1761111
00:02:09.08 198.62  193.4626316
00:02:10.06 190.79  193.329
00:02:11.03 193.35  193.33
00:02:12.00 199.36  193.6040909
00:02:12.98 190.76  193.4804348
00:02:13.95 205.16  193.9670833
00:02:14.92 194.89  194.004
00:02:15.90 185.3   193.6692308

像这样。 (12000+ 行) 我想将时间与温度的关系绘制为线图,x 轴上每小时刻度(1 小时间隔)。 但不知何故,我无法以适当的频率分配 x 滴答声。

fig, ax = plt.subplots()
ax.plot(data['time'], data['temp'])
ax.plot(data['time'], data['temp_mean'],color='red')
xformatter = mdates.DateFormatter('%H:%M')
xlocator = mdates.HourLocator(interval = 1)

## Set xtick labels to appear every 15 minutes
ax.xaxis.set_major_locator(xlocator)

## Format xtick labels as HH:MM
ax.xaxis.set_major_formatter(xformatter)

fig.autofmt_xdate()
ax.tick_params(axis='x', rotation=45)
plt.show()

这里的 xticks 似乎很拥挤和重叠,但我需要从 0:0023:00 的刻度,间隔为一小时。 我该怎么办?

【问题讨论】:

可能问题是 00:01:51.57 是字符串,它们可能需要格式化为 pandas timedelta 之类的格式。见Convert string to timedelta in pandas 是的,但是当我转换为日期时间时,xticks 似乎很好,但整个情节显示出不同的模式。这是那个情节假设除了 xtick 部分/ 没有足够的数据来重现它。能否提供完整数据的链接? 【参考方案1】: 使用pd.to_datetime'time' 列转换为datetime dtype,然后使用.dt accessor 提取时间分量。 请参阅python datetime format codes 以指定format=... 字符串。 使用pandas.DataFrame.plot 绘图 python 3.8.12pandas 1.3.3matplotlib 3.4.3中测试
import pandas as pd

# sample data
data = 'time': ['00:01:51.57', '00:01:52.54', '00:01:53.51', '00:01:54.49', '00:01:55.46', '00:01:56.43', '00:01:57.41', '00:01:58.38', '00:01:59.35', '00:02:00.33', '00:02:01.30', '00:02:02.27', '00:02:03.24', '00:02:04.22', '00:02:05.19', '00:02:06.17', '00:02:07.14', '00:02:08.11', '00:02:09.08', '00:02:10.06', '00:02:11.03', '00:02:12.00', '00:02:12.98', '00:02:13.95', '00:02:14.92', '00:02:15.90'],
        'temp': [185.94, 187.48, 197.85, 195.71, 197.22, 187.33, 194.18, 199.9, 184.23, 201.34, 200.12, 199.13, 187.47, 187.65, 195.59, 188.7, 196.16, 191.17, 198.62, 190.79, 193.35, 199.36, 190.76, 205.16, 194.89, 185.3],
        'temp_mean': [185.94, 186.71, 190.4233333, 191.745, 192.84, 191.9216667, 192.2442857, 193.20125, 192.2044444, 193.118, 193.7545455, 194.2025, 193.6846154, 193.2535714, 193.4093333, 193.115, 193.2941176, 193.1761111, 193.4626316, 193.329, 193.33, 193.6040909, 193.4804348, 193.9670833, 194.004, 193.6692308]
df = pd.DataFrame(data)

# convert column to datetime and extract time component
df.time = pd.to_datetime(df.time, format='%H:%M:%S.%f').dt.time

# plot
ax = df.plot(x='time', color=['tab:blue', 'tab:red'])

【讨论】:

以上是关于如何从日期时间格式的数据在轴中添加每小时刻度的主要内容,如果未能解决你的问题,请参考以下文章

Python matplotlib可视化:自定义轴标签格式化函数(在轴刻度上添加自定义的数值以及符号形式)使用自定义函数在Matplotlib中为坐标轴刻度添加自定义符号(例如,货币符号¥$等)

KeyError:“在轴中找不到[列]”[重复]

在绘图直方图 x 轴中格式化刻度

pyplot 轴中日期时间的格式

Python在轴上将一年中的日期转换为月份

从 D3.js 轴中删除结束标记