我正在尝试编写一对函数plottm
和unixtm
,它们在正常的unix时间(1970-01-01以来的秒数)和Matplotlib的日期表示(从-1BC的最后一天算起的天数,或者是一个浮点数)之间来回转换。
如果plottm
和unixtm
是正确的倒数,则此代码将打印相同的日期/时间两次:
import time, datetime
import matplotlib.dates as dt
# Convert a unix time u to plot time p, and vice versa
def plottm(u): return dt.date2num(datetime.datetime.fromtimestamp(u))
def unixtm(p): return time.mktime(dt.num2date(p).timetuple())
u = 1270000000
print datetime.datetime.fromtimestamp(u), "-->", \
datetime.datetime.fromtimestamp(unixtm(plottm(u)))
唉,它关闭了一个小时(这只发生在一些时间戳上,否则我会插入一个偏移量并完成它)。
可能相关:Problems with Localtime
更新:与Matplotlib无关的相关问题:Convert a unixtime to a datetime object and back again (pair of time conversion functions that are inverses)
最佳答案
基于@dreeves答案,一个适合于使用时区感知日期时间的解决方案:
import matplotlib.dates as dt
from calendar import timegm
from datetime import datetime
from pytz import utc
# Convert a unix time u to plot time p, and vice versa
def plottm(u):
return dt.date2num(datetime.fromtimestamp(u, utc))
def unixtm(p):
return timegm(dt.num2date(p, utc).utctimetuple())
u = 1270000000
print datetime.fromtimestamp(u, utc), "-->", \
datetime.fromtimestamp(unixtm(plottm(u)), utc)
输出(测试了几个时区):
2010-03-31 01:46:40+00:00 --> 2010-03-31 01:46:40+00:00