格式化日期时间标签以包含熊猫图的工作日名称

Posted

技术标签:

【中文标题】格式化日期时间标签以包含熊猫图的工作日名称【英文标题】:Format datetime labels to include weekday name for pandas plot 【发布时间】:2015-11-07 12:46:33 【问题描述】:

我想将相应的工作日名称(周一、周二等)添加到熊猫时间序列图的 xlabels。

import pandas as pd
import numpy as np
import pylab as p
import datetime

dates = pd.date_range(datetime.datetime.today().date(), periods=10, freq='D')
data = pd.DataFrame(np.arange(10),index=dates,columns=['A'])
a = data['A'].plot()
p.tight_layout()
p.show()

我尝试使用以下方法调整格式:

from matplotlib.dates import DateFormatter
formatter = DateFormatter('%a %d-%m-%Y')
a.xaxis.set_major_formatter(formatter)

但这不起作用,导致日期和年份不正确。

似乎应该有一个很简单的解决方案,但我找不到。

【问题讨论】:

好像dates.weekday 应该能够提供一些帮助? 【参考方案1】:

以下是我认为可行但没有成功的方法:

from matplotlib.ticker import FuncFormatter
from matplotlib import pyplot as plt

ax = data.A.plot()
ax.xaxis.set_major_formatter(FuncFormatter(lambda d, _: d.strftime('%a')))

ax = plt.subplot()
ax.plot(data.index, data.A)
ax.xaxis.set_major_formatter(FuncFormatter(lambda d, _: d.strftime('%a')))

这些都以不同的方式出错。在这两种情况下,格式化程序输入似乎都是 floats 而不是日期。首先,该函数仅应用于第一个和最后一个刻度。你可以通过传递看到这一点

ax.xaxis.set_major_formatter(FuncFormatter(lambda d, _: d) 

这是一个非常灵活的解决方案:

ax = plt.subplot()
ax.plot(data.index, data.A)
ticks = ax.set_xticklabels([d.strftime('%a') for d in data.index])

您可以将最后一行的列表推导换成您喜欢的任何内容。

编辑:

我想我已经弄清楚这些代表xticks 的数字是什么意思了。

In [37]: 
ax = plt.subplot()
ax.plot(data.index, data.A)
print  ax.get_xticks()
[ 735824.  735825.  735826.  735827.  735828.  735829.  735830.  735831.
  735832.  735833.]

这些似乎代表自公元 1 年开始以来的天数:据此:http://www.epochconverter.com/epoch/seconds-days-since-year-0.php

“从 0000-00-00 到今天(2015 年 8 月 14 日)之间有 736189 天。”

正好是 735824(第一个刻度)+ 365。到目前为止还很糟糕。 您可以(我不会打扰)编写一个函数来将此数字和类似的数字转换为日期。另一种方法是:

def get_day(tick):
    date = dates[0] + datetime.timedelta(tick - ticks[0])
    return date.strftime('%a')

ax = plt.subplot()
ax.plot(data.index, data.A)
ticks = ax.get_xticks()
ax.xaxis.set_major_formatter(FuncFormatter(lambda tick, _: get_day(tick)))

同样,您可以将所需的日期格式子转换为 get_day。不确定这是否会解决平移/缩放问题,但至少它提供了一种使用函数设置刻度标签的方法。

【讨论】:

不幸的是,当您缩放或平移绘图时,标签会发生变化并且与数据点不对齐。 我没有任何使用matplotlib 平移或缩放的经验。不知道该怎么办。 好的,我已经编辑了答案以包含一个使用(非常hacky)函数的解决方案。也许这将解决平移/缩放问题 我的正常用例是绘制时间线数据,然后通过弹出式 GUI(平移和缩放)与其交互,以探索感兴趣的区域。唉,我怀疑这是一个错误 - 我希望您的第一个解决方案能够处理这种行为。但我没有时间调查。感谢您的努力。 不用担心。这很烦人,我想弄清楚这种奇怪的行为。

以上是关于格式化日期时间标签以包含熊猫图的工作日名称的主要内容,如果未能解决你的问题,请参考以下文章

熊猫:自某个日期以来经过的天数

在数据框中编辑日期以在熊猫中显示年份

熊猫日期列中的不同格式 - 列与行的数据类型

如何格式化熊猫日期时间? [复制]

需要在java中以不同格式格式化字符串日期[关闭]

如何使用 HIVE 以其他格式更改或修改日期列值