如何从包含datetime对象的数组中进行插值?

2024-06-17 14:47:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一个类似于np.interp的函数,它可以处理datetime对象。

例如:

import datetime, numpy as np
arr1 = np.array([datetime.datetime(2008,1,d) for d in range(1,10)])
arr2 = np.arange(1,10)

np.interp(datetime.datetime(2008,1,5,12),arr1,arr2)

理想情况下会返回5.5,但numpy会提高TypeError: array cannot be safely cast to required type。这附近有没有一条不错的Python路线?


Tags: 对象函数inimportnumpyfordatetimeas
3条回答

如果您的时间戳中有/需要亚秒精度,这里有一个经过编辑的rchanganswer版本(基本上只是一个不同的toTimestamp方法)

import datetime, numpy as np

def toTimestamp(d):
  return d.timestamp()

arr1 = np.array([toTimestamp(datetime.datetime(2000,1,2,3,4,5) + datetime.timedelta(0,d)) for d in np.linspace(0,1,9)]) 
arr2 = np.arange(1,10) # 1, 2, ..., 9

result = np.interp(toTimestamp(datetime.datetime(2000,1,2,3,4,5,678901)),arr1,arr2)
print(result) # Prints 6.431207656860352

我不能说任何关于时区的问题,因为我没有用其他时区测试过。

^{} function期望arr1arr2是一维浮点数序列,即,如果要使用np.interp(),应该将datetime对象的序列转换为一维浮点数序列。

如果输入数据对所有datetime对象使用相同的UTC偏移量,则可以通过从所有值中减去引用日期来获得浮点值。如果your input is UTC(偏移量始终为零),则为真:

from datetime import datetime
import numpy as np

arr1 = np.array([datetime(2008, 1, d) for d in range(1, 10)])
arr2 = np.arange(1, 10)

def to_float(d, epoch=arr1[0]):
    return (d - epoch).total_seconds()

f = np.interp(to_float(datetime(2008,1,5,12)), map(to_float, arr1), arr2)
print f # -> 5.5

您可以将它们转换为时间戳(经过编辑以反映使用calendar.timegm以避免与时区相关的陷阱)。

# Python 2.7
import datetime, numpy as np
import calendar

def toTimestamp(d):
  return calendar.timegm(d.timetuple())

arr1 = np.array([toTimestamp(datetime.datetime(2008,1,d)) for d in range(1,10)]) 
arr2 = np.arange(1,10)

result = np.interp(toTimestamp(datetime.datetime(2008,1,5,12)),arr1,arr2)
print result # Prints 5.5

相关问题 更多 >