8 votos

¿Cómo calcular con valores de tiempo en QGIS?

Tengo dos campos de cadena en una capa vectorial, "Desde" y "A", con valores en el formato de 10:16:30 y 10:18:00 por ejemplo

Quiero calcular la diferencia en los minutos de un valor decimal, en este caso 1.5, en el campo de la calculadora y escribe en un verdadero campo para los cálculos posteriores.

Por lo que he entendido hasta ahora, tengo que convertir mis cadenas a QT de tipo de tiempo mediante el uso de totime("From") y totime("To").

Pero ahora ya he llegado al final de mi sabiduría. No importa lo que yo trato, la calculadora de campo no acepta cualquier otra combinación de otras funciones (la Expresión no es válida).

Puede alguien por favor decirme cómo realizar este cálculo y recibir un real campo real con un valor de minutos, o puede que me señale algunos de los recursos con ejemplos de trabajo?

8voto

John Feminella Puntos 123

Es posible sin necesidad de utilizar una función de python, con un poco de hacks:

minute( age( todatetime('2000-01-01 10:18:00'), todatetime(2000-01-01 10:16:30') ) )

regresará "1.5".

Para romper, "edad" devuelve la diferencia entre dos fechas como un tipo de intervalo. Esto debe ser envuelto en la función de "minutos" para extraer la longitud de este intervalo en minutos. Por último, he tenido que poner fechas simuladas en las funciones de "todatetime" como la función de "edad" sólo funciona en los tipos datetime, no llanos veces.

4voto

Mat Puntos 196

Si usted está usando 2,8 o más tarde, usted puede usar la función de Python generador. Este código va a hacer el cálculo. Yo no creo que usted necesita para el uso de Qt objetos de este.

from qgis.core import *
from qgis.gui import *
from datetime import datetime
import time
@qgsfunction(args=2, group='Python')
def timedifference(values,feature,parent):
    ''' 
    call this function as timedifference("fromtime","totime")
    no need to pass in feature/parent
    '''
    fromtime = datetime.strptime(values[0], "%H:%M:%S")
    totime = datetime.strptime(values[1], "%H:%M:%S")
    a = totime - fromtime
    return a.seconds/60.0

Guardar este script como 'timedifference'. Volver al editor de expresión.

Usted puede, a continuación, utilizar la función en el editor de expresión. Usted debe encontrar agrupados bajo 'Python'

timedifference("from_field","to_field")

He asumido que "from_field" y "to_field" son los campos de cadena, y que "to_field" es posterior a "from_field".

Si usted es nuevo a la función de Python generador, hay un práctico video aquí en youtube

EDIT: no tengo suficiente rep comentar Nyall la respuesta (unido), pero es una buena, mucho más elegante.

Con un pequeño tweak te sugiero esto:

minute( age( todatetime('2000-01-01 ' ||  "timeto" ), todatetime('2000-01-01 ' ||   "timefrom" ) ) )

Asegúrese de que usted no se olvide de añadir el espacio final después de la fecha. La edad() función parece asumir la fecha posterior que es el primer parámetro.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X