如何更改日期时间刻度标签频率

2025-03-21 09:07:00
admin
原创
60
摘要:问题描述:下面显示了模拟数据的图,其中包含我想要修改的 xticks。默认情况下,pd.df.plot 选择相隔约 3 个月的日期作为刻度。但我想要的是每个月都是一个刻度。最好的方法是什么?季节性刻度呢?提前谢谢您。解决方案 1:首先,您必须将 pandas 日期对象转换为 python 日期对象。由于 ma...

问题描述:

下面显示了模拟数据的图,其中包含我想要修改的 xticks。默认情况下,pd.df.plot 选择相隔约 3 个月的日期作为刻度。但我想要的是每个月都是一个刻度。最好的方法是什么?季节性刻度呢?提前谢谢您。

在此处输入图片描述


解决方案 1:

首先,您必须将 pandas 日期对象转换为 python 日期对象。由于 matplotlib 内部日期转换函数,因此需要进行此转换。然后使用函数matplotlib.dates设置所需的格式化程序和勾选位置,如下所示:

import pandas as pd
import numpy as np
import matplotlib.pylab as plt
import matplotlib.dates as mdates

# convert date objects from pandas format to python datetime
index = pd.date_range(start = "2015-07-01", end = "2017-01-01", freq = "D")
index = [pd.to_datetime(date, format='%Y-%m-%d').date() for date in index]
data = np.random.randint(1,100, size=len(index))
df = pd.DataFrame(data=data,index=index, columns=['data'])
print (df.head())

ax = df.plot()
# set monthly locator
ax.xaxis.set_major_locator(mdates.MonthLocator(interval=1))
# set formatter
ax.xaxis.set_major_formatter(mdates.DateFormatter('%d-%m-%Y'))
# set font and rotation for date tick labels
plt.gcf().autofmt_xdate()

plt.show()

对于季节标签,您必须自行构建,然后使用plt.setp功能进行设置(对于月份 02 设置标签winter,04 -spring等等)
plt.setp(new_labels, rotation=90, fontsize=9):。

在此处输入图片描述

国防部长:

            data
2015-07-01    26
2015-07-02    33
2015-07-03    46
2015-07-04    69
2015-07-05    17

解决方案 2:

该答案基于Serenity 的答案以及ImportanceOfBeingErnest 的答案。

自定义时间序列刻度标签的最佳方法是使用matplotlib.dates模块 (mdates) 中的刻度定位器和格式化程序。不过值得注意的是,如果您想要基于与绘制的时间序列相同单位的刻度频率,则使用日期作为字符串创建和格式化刻度标签可能会更方便,就像在有关熊猫条形图的这个问题的答案中一样。

根据文档中所述,pandas 使用 matplotlib为时间序列创建具有其自己的自定义刻度格式化程序的图:

pandas 为时间序列图提供了自定义格式化程序。这些格式化程序会更改日期和时间轴标签的格式。默认情况下,自定义格式化程序仅适用于使用 DataFrame.plot() 或 Series.plot() 创建的 pandas 图。

熊猫时间序列图的刻度和标签当前默认格式如下:

import numpy as np                   # v 1.19.2
import pandas as pd                  # v 1.1.3
import matplotlib.dates as mdates     # v 3.3.2

# Create random dataset stored as a pandas DataFrame with a DatetimeIndex
rng = np.random.default_rng(seed=1) # random number generator
date_day = pd.date_range(start='2015-07-01', end='2016-12-31', freq='D')
traffic = rng.lognormal(sigma=2, size=date_day.size)
df_day = pd.DataFrame(dict(traffic=traffic), index=date_day)

# Create pandas plot with default settings except for figure size
df_day.plot(figsize=(10,5));

pd_默认_图

为了能够使用 mdates 刻度定位器和格式化程序并覆盖默认刻度格式,pandas 日期必须被 matplotlib 正确识别。问题是 pandas 和 matplotlib 计算用于在时间轴(默认为 x 轴)上定位刻度的日期数字的方法不同。

在 pandas 中,时间以纳秒为单位测量,从零开始1970-01-01 00:00:00(Unix 纪元的原点),各个时间点存储为pandas 时间戳对象。但是在为图表创建时间尺度时,pandas 使用另一种编号系统,该系统从同一原点开始,但随后在所选频率的每个周期增加 1(在此示例中,频率以天为单位)。

Matplotlib自 2020 年 7 月发布的 3.3.0 版本以来,使用与 Pandas 相同的默认原点,但日期始终按天数编号:

Matplotlib 使用浮点数表示日期,指定自默认纪元 1970-01-01 UTC 以来的天数;例如,1970-01-01, 06:00 是浮点数 0.25。

你可以在使用 Pandas 时运行ax.get_xticks()来检查正在使用的数字。ax = df.plot()

您可能已经猜到了,这意味着当时间序列以天为单位的频率时,不需要进行日期转换,如下面简单的自定义刻度定位器和格式化程序所示:

ax = df_day.plot(figsize=(10,5))

# Create custom ticks using matplotlib date tick locator and formatter
loc = mdates.MonthLocator(interval=2)
ax.xaxis.set_major_locator(loc)
fmt = mdates.DateFormatter('%b
%Y')
ax.xaxis.set_major_formatter(fmt)

pd_tsdays_customticks

这种特殊情况便于保留其他 pandas 的 x 轴范围和次要 x 刻度的默认设置。但这是一般规则的一个例外。

为了能够将 mdates 刻度定位器和格式化程序与任何类型的频率时间序列的 pandas 图一起使用,您需要使用(长期存在但文档字符串中没有且几乎没有文档记录)x_compat=True参数。以下示例说明了如何使用相同的数据集重新采样为每月频率。通常情况下,您可能只想稍微调整默认的 pandas 格式,因此在下面的示例中,从头开始重新创建默认格式,以显示可以使用哪些方法来调整它:

# Resample time series to monthly frequency and plot it using date
# numbers that are compatible with mdates
df_month = df_day.resample('MS').sum()
ax = df_month.plot(figsize=(10,5), x_compat=True)

# Set major and minor date tick locators
maj_loc = mdates.MonthLocator(bymonth=np.arange(1,12,2))
ax.xaxis.set_major_locator(maj_loc)
min_loc = mdates.MonthLocator()
ax.xaxis.set_minor_locator(min_loc)

# Set major date tick formatter
zfmts = ['', '%b
%Y', '%b', '%b-%d', '%H:%M', '%H:%M']
maj_fmt = mdates.ConciseDateFormatter(maj_loc, zero_formats=zfmts, show_offset=False)
ax.xaxis.set_major_formatter(maj_fmt)

ax.figure.autofmt_xdate(rotation=0, ha='center')
ax.set_xlim(df_month.index.min(), df_month.index.max());

pandas_tsmonths_customticks


文档:pd.date_range、日期格式mdates.ConciseDateFormatter代码、、fig.autofmt_xdate

解决方案 3:

我很难让@Serenity 的答案发挥作用,因为我直接使用 Matplotlib,而不是绘制 Pandas 数据集。所以如果你是其中之一,我的答案可能会有所帮助。

使用 Matplotlib.plot() 绘图

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# Process dataset
bitcoin['Date'] = pd.to_datetime(bitcoin['Date'])
bitcoin['Open'] = pd.to_numeric(bitcoin['Open'])

# Plot
plt.figure()
plt.plot(bitcoin['Date'], bitcoin['Open'])
ax = plt.gca()
ax.xaxis.set_major_locator(mdates.MonthLocator(interval=4))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%d-%m-%Y'))
plt.gcf().autofmt_xdate() # Rotation
plt.show()
bitcoin[['Date', 'Open']].head()

    Date        Open
0   2017-09-05  4228.29
1   2017-09-04  4591.63
2   2017-09-03  4585.27
3   2017-09-02  4901.42
4   2017-09-01  4701.76

比特币价格图表

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用