在Python中使用datetime

在Python中使用datetime,python,datetime,Python,Datetime,我有大量的时间是以hh:mm:ss的格式写的,如果我使用下面的代码并打印x是什么,我会得到1900,1,1,10,29,34的每个时间戳。我怎样才能去掉年、月和日期?因为我希望时间的格式是hh:mm:ss 编辑:在注释的帮助下,更新了整个代码 import matplotlib.pyplot as plt import matplotlib.ticker import time import datetime x = ['10:29:55', '10:34:44'] sy

我有大量的时间是以hh:mm:ss的格式写的,如果我使用下面的代码并打印x是什么,我会得到1900,1,1,10,29,34的每个时间戳。我怎样才能去掉年、月和日期?因为我希望时间的格式是hh:mm:ss

编辑:在注释的帮助下,更新了整个代码

import matplotlib.pyplot as plt
import matplotlib.ticker
import time
import datetime

x = ['10:29:55', '10:34:44']           
sy1 = [679.162, 679.802]

x_labels = [datetime.datetime.strptime(elem, '%H:%M:%S') for elem in x]
formatter = matplotlib.ticker. FixedFormatter(x_labels)
plt.gca().xaxis.set_major_formatter(formatter)
plt.gca().xaxis.set_minor_formatter(formatter)

plt.plot(x_labels, sy1, 'ro')
plt.xlabel('Time')
plt.ylabel('Position')
plt.show()
但很明显,当考虑到年、月和日期时,它也会显示时间


如果我使用strftime而不是strtime,我会得到一个TypeError:描述符“strftime”需要一个“datetime.date”对象,但收到了一个“str”Ok。有几种方法可以得到你想要的

如果你愿意满足于微秒,你应该非常接近你所需要的:

import matplotlib.pyplot as plt
import datetime

time_strings = ['10:29:55', '10:34:44']           
sy1 = [679.162, 679.802]

times = [datetime.datetime.strptime(elem, '%H:%M:%S') for elem in time_strings]
plt.plot(times, sy1, 'ro')
plt.xlabel('Time')
plt.ylabel('Position')
plt.show()
这应该在绘图中显示所需的时间,仅在格式中显示微秒。微秒让一切变得丑陋,但我唯一的更改是为了清晰起见-我没有
导入时间
导入matplotlib.ticker
,我将
x
更改为更准确的变量名,并像您那样创建了日期时间。为了摆脱微秒,事情变得更加丑陋。您不能只使用FixedFormatter,因为我们只设置了2个值,而标准绘图有2个以上的刻度;您必须找到让FuncFormatter工作的方法。这可以正常工作,但仍然太吵了,所以我也添加了
plt.gcf().autofmt\u xdate()

import matplotlib.pyplot as plt
import matplotlib.ticker
import datetime
import pylab

time_strings = ['10:29:55', '10:34:44']           
sy1 = [679.162, 679.802]

times = [datetime.datetime.strptime(elem, '%H:%M:%S') for elem in time_strings]
plt.plot(times, sy1, 'ro')
formatter = matplotlib.ticker.FuncFormatter(lambda tick_value, _: datetime.datetime.strftime(pylab.num2date(tick_value), '%H:%M:%S'))
plt.gca().xaxis.set_major_formatter(formatter)
plt.gca().xaxis.set_minor_formatter(formatter)
plt.xlabel('Time')
plt.ylabel('Position')
plt.gcf().autofmt_xdate()
plt.show()
定义FuncFormatter的行很乱。我定义了一个lambda,它是一个在单行上定义的函数。FuncFormatter要求它接受2个参数。第一个是tick_值,我们并不真正关心第二个是什么,所以我给了它一个标准变量名
\uu
,表示我们不关心。刻度值是日期时间或时间戳。从tick值到datetime的方法是调用pylab.num2date


您会发现第二种解决方案正是您所需要的。您需要做的关键事情是跟踪您的变量类型,以及在何处需要哪些变量类型。

好的。有几种方法可以得到你想要的

如果你愿意满足于微秒,你应该非常接近你所需要的:

import matplotlib.pyplot as plt
import datetime

time_strings = ['10:29:55', '10:34:44']           
sy1 = [679.162, 679.802]

times = [datetime.datetime.strptime(elem, '%H:%M:%S') for elem in time_strings]
plt.plot(times, sy1, 'ro')
plt.xlabel('Time')
plt.ylabel('Position')
plt.show()
这应该在绘图中显示所需的时间,仅在格式中显示微秒。微秒让一切变得丑陋,但我唯一的更改是为了清晰起见-我没有
导入时间
导入matplotlib.ticker
,我将
x
更改为更准确的变量名,并像您那样创建了日期时间。为了摆脱微秒,事情变得更加丑陋。您不能只使用FixedFormatter,因为我们只设置了2个值,而标准绘图有2个以上的刻度;您必须找到让FuncFormatter工作的方法。这可以正常工作,但仍然太吵了,所以我也添加了
plt.gcf().autofmt\u xdate()

import matplotlib.pyplot as plt
import matplotlib.ticker
import datetime
import pylab

time_strings = ['10:29:55', '10:34:44']           
sy1 = [679.162, 679.802]

times = [datetime.datetime.strptime(elem, '%H:%M:%S') for elem in time_strings]
plt.plot(times, sy1, 'ro')
formatter = matplotlib.ticker.FuncFormatter(lambda tick_value, _: datetime.datetime.strftime(pylab.num2date(tick_value), '%H:%M:%S'))
plt.gca().xaxis.set_major_formatter(formatter)
plt.gca().xaxis.set_minor_formatter(formatter)
plt.xlabel('Time')
plt.ylabel('Position')
plt.gcf().autofmt_xdate()
plt.show()
定义FuncFormatter的行很乱。我定义了一个lambda,它是一个在单行上定义的函数。FuncFormatter要求它接受2个参数。第一个是tick_值,我们并不真正关心第二个是什么,所以我给了它一个标准变量名
\uu
,表示我们不关心。刻度值是日期时间或时间戳。从tick值到datetime的方法是调用pylab.num2date


您会发现第二种解决方案正是您所需要的。您需要做的关键事情是跟踪您的变量类型是什么,以及在何处需要哪些变量类型。

那么,解析日期时间或绘图的问题是什么?将这两件事分开,独立处理。尝试
plt.plot(x,y)
。x和y已经是列表,在本例中matplotlib不需要二维列表。您的编辑已删除对图像的引用。您正在尝试使用matplotlib绘图吗?你可能想要。如果您可以编辑您正在使用的绘图库,您可能会得到愿意回答的人。如果您的问题被重新打开,我将发布一个答案,但现在请尝试
plt.gcf().autofmt\u xdate()
。这将获得当前的数字并设置AutoFMTxDate,这将使日期尽可能整洁(包括删除固定的日期并只显示时间)。我已经尝试过plt.gfc()AutoFMTxDate(),它只会倾斜数字,使其更整洁。那么,解析日期时间还是绘图的问题呢?将这两件事分开,独立处理。尝试
plt.plot(x,y)
。x和y已经是列表,在本例中matplotlib不需要二维列表。您的编辑已删除对图像的引用。您正在尝试使用matplotlib绘图吗?你可能想要。如果您可以编辑您正在使用的绘图库,您可能会得到愿意回答的人。如果您的问题被重新打开,我将发布一个答案,但现在请尝试
plt.gcf().autofmt\u xdate()
。这将获取当前数字并设置AutoFMTxDate,这将使日期尽可能整洁(包括删除常数日期并仅显示时间)。我已经尝试过plt.gfc()AutoFMTxDate(),它只倾斜数字,使其更整洁。谢谢。你是说plt.gca()?不幸的是,我得到了一个x中的值显示为1900-01-01 10:29:34的图,所以我仍然需要去掉那些年/月/日期戳。顺便说一句,我借用了你的上一个代码,我不想完全改变我的旧代码:)我更新了整个代码,正如我在第一篇文章(刚才)中所写的,如果我使用strftime,我会得到一个TypeError。对不起,我真的是个新手。感谢您添加所有代码。:-)今后,请从一开始就这样做。我将重写我的答案,以反映您现在告诉我们的内容。看,这是我在给出答案时使用的。在这一点上,你的问题是一个好问题,但它会容易得多(如果有人更熟练,你会更快地得到答案)