如何从日期时间对象中仅提取月份和日期?

Posted

技术标签:

【中文标题】如何从日期时间对象中仅提取月份和日期?【英文标题】:How to extract only the month and day from a datetime object? 【发布时间】:2017-04-05 16:34:12 【问题描述】:

我试图做一个散点图,我的 x 轴需要是一年中的每一天。 我首先读取数据文件并获取日期列,其中填充了整数,例如 19800801。所以我将这个 integer 转换为 datetime,如下所示:

datetimes_0 = datetime.strptime(str(dates_pitts[0]), '%Y%m%d')

然后我想通过编写从 datetime 对象中只提取月份和日期:

s = datetimes_0.strftime("%m%d")

我意识到他们从strftime 返回的值不再是日期时间对象,所以我尝试通过这样做将其转换回日期时间对象

s0= datetime.strptime(s, '%m%d')

但不是只给我月和日,而是给我整年、月和日。 我的问题是如何从给定的整数(如 19800801)中提取只有月份和日期(两者)的日期时间对象?

【问题讨论】:

您想从字符串中获取日期时间对象,还是想将字符串转换为日期时间? 我想先将整数 19800801 转换为日期时间对象,但我只需要月份和日期,0801。所以基本上我想要一个只包含月份和日期的日期时间对象,比如 0801,但这里 0801 不是整数,而是日期时间对象。这有意义吗? 【参考方案1】:

这将采用一个整数(假设它是一个有效的纪元)并将其转换为 python 日期时间对象:

>>> import datetime
>>> date = datetime.datetime.fromtimestamp(19800801)
>>> print date.month
8
>>> print date.day
17

或使用 strftime(返回字符串而不是日期时间对象):

>>> datetime.datetime.fromtimestamp(19800801).strftime('%m%d')
'0817'

将月份和日期输出为单个整数:

>>> int(datetime.datetime.fromtimestamp(19800801).strftime('%m%d'))
817

【讨论】:

但是通过使用 strftime,它给了我一个字符串而不是一个 datetime 对象,我如何将它转换为 datetime 对象?只有月份和日期。 您无法使用第一个示例中的日期时间对象的任何原因? 因为我需要一个对象中的月份和日期。我试图绘制一个散点图,每个单独的日期(没有年份)将构成我的轴(所以 365 天将是我的 x 轴),我的 y 轴是该日期的温度。所以回到你的问题,我需要把月和日作为一个对象,这样我就可以把它放在我的 plt.scatter() 参数中 在我提供的第一个示例中,日期时间对象“日期”包含所有信息,包括月份和日期,可通过日期时间方法访问,即 date.day 和 date.month。我不确定我是否理解您的要求,因为您似乎同时要求一个日期时间对象和一个仅包含月份和日期的字符串。 plt.scatter() 需要 datetime 对象还是可以使用字符串? 哎呀,现在我想起来你可能只需要一个整数来表示 plt.scatter:【参考方案2】:

您将日期字符串转换为datatime 对象的方法是正确的。它通常应该包含尽可能多的信息。

然后您希望仅使用日期和月份来使用 matplotlib 绘制基于时间的数据。通常的方法是首先将您的日期转换为 datatime 对象(您已经完成),然后让 matplotlib 使用 date2num() 函数将这些值转换为它自己的内部表示。

给这个函数整个datetime 对象包括年份。如果您的数据恰好跨越 12 个月(或者从 12 月跨越到 1 月),您将需要它,即使您不希望显示它。

接下来,您可以告诉 matplotlib 如何使用格式化程序格式化 x 轴上的任何刻度,在本例中为 DateFormatter()。因此,您可以选择显示每个刻度的月份和日期。

在本例中,我显示月份,下面一行显示日期:

from matplotlib import pyplot, dates
from datetime import datetime

data = [("19800801", 16), ("19800810", 10), ("19800901", 15), ("19800905", 14)]

xaxis = [datetime.strptime(d, '%Y%m%d') for d, v in data]
yaxis = [v for d, v in data]

ax = pyplot.gca()
xaxis = dates.date2num(xaxis)    # Convert to maplotlib format
hfmt = dates.DateFormatter('%m\n%d')
ax.xaxis.set_major_formatter(hfmt)

pyplot.xlabel('Date')
pyplot.ylabel('Value')
pyplot.plot(xaxis, yaxis)
pyplot.tight_layout()

pyplot.show()

这将显示如下:

然后您可以扩展它以使用 DayLocator(),它告诉 matplotlib 将 xticks 放置在确切的日期位置,如下所示:

ax.xaxis.set_major_locator(dates.DayLocator())

给你:

【讨论】:

嗨:这很有帮助!我有另一个问题。因为我需要绘制 13 年的数据,所以我希望 x 轴只有一年的日期(366 天),这样每个日期的值就可以显示在同一日期,而不是年份。例如,7 月 4 日 (85F) 的温度可以显示在同一 y 轴上,无论它是在哪一年。它是如何工作的? 正如你所说,最好作为一个不同的问题。您需要将数据分成年份块(没有年份),然后分别绘制每个块(可能使用不同的颜色)。 本质上是将你的数据转换为datetime对象,然后根据年份值将它们吐到不同的图中。然后,您需要修改每个数据列表中的年份以具有相同的值。由于您没有显示年份,因此可以是任何值,例如 2000

以上是关于如何从日期时间对象中仅提取月份和日期?的主要内容,如果未能解决你的问题,请参考以下文章

从数据库中提取数据时如何在 GridView 中仅显示日期? C#

从jooq中的日期获取月份名称

如何从R中具有月份名称的时间戳中提取日期

如何从 DataFrame 的日期列中提取月份名称和年份

如何从 MDX 查询中提取日期中的月份年份

从 r 中的日期中仅提取季度