如何解决为什么datetime,timedelta会给出不同的值
我有一个.mat文件,其数字列代表相对于2014年1月1日的日期。我正在尝试将它们转换为绝对日期。这是当我尝试使用单个值的时候:
start = datetime(2014,1,0)
new = start + timedelta(days=342.41666667)
# 2014-12-09 10:00:00.000288
new = start + timedelta(days=342.420138888850)
# 2014-12-09 10:04:59.999997
但是,当我遍历整个数组的循环时:
n = time.size
start = datetime(2014,0)
time_new = np.zeros(n,dtype = datetime)
ind = 0
for i in time:
time_new[ind] = start + timedelta(days = i[0])
ind = ind + 1
# time[0:2] ---array([[342.41666667],# [342.42013889]])
# time_new[0:2] --- array([datetime.datetime(2014,12,9,59,999997),# datetime.datetime(2014,10,4,
第一个值的转换时间比前一个(2014-12-09 10:00:00.000288)晚2秒钟(2014、12、9、9、59、59)。我不明白为什么应该有所不同。请帮忙。
解决方法
当您打印出time[0:2]
时,该值将四舍五入到小数点后8位,大约相当于毫秒级。但是,计算是基于完整值进行的,该完整值略有不同(在这种情况下,约为0.3ms)。
如何解决此问题取决于您到底需要什么。如果您知道数据的分辨率(毫秒或更粗),则可以简单地舍入到最接近的毫秒。
如果您知道一些行的实际值,则可以检查它们与期望值的接近程度。例如,您是否希望第一行是2014-12-09 10:00?如果是这样,那么您只有3微秒的时间,这是可以接受的(或者您可以对其余部分使用四舍五入法。)
如果需要更精确的转换,则可能需要检查输入中的精度(二进制(IEEE浮点数)还是十进制数),然后进行相应的操作。
一项无关的改进;您可以使用以下方法来代替手动计算ind
:
for ind,i in enumerate(time):
time_new[ind] = start + timedelta(days = i[0])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。