Преобразовать строку в дату и время как результат перехвата между двумя строками - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь получить информацию о том, в какой конкретный день мой график перехватывает пороговое значение (определенный хлайн в данном случае y = -1).Вот некоторые из моих результатов:

(11.805201846946158, -1.0)
(12.99215619183464, -1.0)
(21.33191612908414, -1.0)
(22.633241076423914, -1.0)
(37.00391584924397, -1.0)

Я бы хотел получить вместо 11.8052 ... значение конкретной даты и времени.График строится в datetime.Что я должен добавить в свой сценарий, чтобы распечатать их вовремя?

spi_avg_1['spi3'].plot(label='SPI 3- monthly')
plt.axhline(y=-1, color='r', linestyle='-', linewidth=0.5)
plt.title('SPI 3-monthly')

yys = [-1]
xx, yy = [], []
xo,yo = [k for k in range(200)],spi_avg_1['spi3']
for i in range(1,len(spi_avg_1['spi3'])):
    for k in yys:
        p1 = np.array([xo[i-1],yo[i-1]],dtype='float')
        p2 = np.array([xo[i],yo[i]],dtype='float')
        k1 = np.array([xo[i-1],k],dtype='float')
        k2 = np.array([xo[i],k],dtype='float')
        if crosses((p2,p1),(k1,k2)):
            seg = line_intersection((p2,p1),(k1,k2))
            print(seg)

enter image description here

1 Ответ

0 голосов
/ 14 сентября 2018

Набор данных:

spi = Dataset('spi3_6_12_1deg_cru_ts_3_21_1949_2012.nc')
lats = spi.variables['lat'][:]  
lons = spi.variables['lon'][:]  
time = spi.variables['time'][:]  
spi3 = spi.variables['spi3'][:]
spi6 = spi.variables['spi6'][:]
spi12 = spi.variables['spi12'][:]

ds = xr.open_dataset('spi3_6_12_1deg_cru_ts_3_21_1949_2012.nc')
ds_mlw = ds.sel(lon=slice(33,37), lat=slice(-18,-13), time=slice("2002-01-01", "2017-11-01"))

spi_avg_1 = ds_mlw.mean(dim=('lon', 'lat'))

Сценарий выглядит следующим образом:

def line_intersection(line1, line2):
    xdiff = (line1[0][0] - line1[1][0], line2[0][0] - line2[1][0])
    ydiff = (line1[0][1] - line1[1][1], line2[0][1] - line2[1][1]) #Typo was here

def det(a, b):
    return a[0] * b[1] - a[1] * b[0]

div = det(xdiff, ydiff)
    if div == 0:
    return None

    d = (det(*line1), det(*line2))
    x = det(d, xdiff) / div
    y = det(d, ydiff) / div
    return x, y

def near(a, b, rtol=1e-5, atol=1e-8):
    return abs(a - b) < (atol + rtol * abs(b))
def crosses(line1, line2):
"""
Return True if line segment line1 intersects line segment line2 and 
line1 and line2 are not parallel.
"""
    (x1,y1), (x2,y2) = line1
    (u1,v1), (u2,v2) = line2
    (a,b), (c,d) = (x2-x1, u1-u2), (y2-y1, v1-v2)
    e, f = u1-x1, v1-y1
    denom = float(a*d - b*c)
    if near(denom, 0):
    # parallel
       return False
    else:
        t = (e*d - b*f)/denom
        s = (a*f - e*c)/denom
    # When 0<=t<=1 and 0<=s<=1 the point of intersection occurs within the
    # line segments
        return 0<=t<=1 and 0<=s<=1


 spi_avg_1['spi3'].plot(label='SPI 3- monthly')

plt.axhline(y=-1, color='r', linestyle='-', linewidth=0.5) #threshold spi idicicator of drought

plt.title('SPI 3-monthly')

yys = [-1]
xx, yy = [], []
xo,yo = [k for k in range(200)],spi_avg_1['spi3']

for i in range(1,len(spi_avg_1['spi3'])):
    for k in yys:
        p1 = np.array([xo[i-1],yo[i-1]],dtype='float')
        p2 = np.array([xo[i],yo[i]],dtype='float')
        k1 = np.array([xo[i-1],k],dtype='float')
        k2 = np.array([xo[i],k],dtype='float')
        if crosses((p2,p1),(k1,k2)):
            seg = line_intersection((p2,p1),(k1,k2))
            plt.scatter(seg[0],seg[1],c='red',s=90)
            print(seg)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...