Should I be switching from Kinematic to Rigidbody then for this code to work?

It would need to be a KinematicBody. This will snap the rotation. Once you get the math working, you can use a linear interpolate to smooth it.

var villagerTargetLocation : Vector3
var villagerTargetRotation : Basis
var rotationLerp = 0.0
var rotationSpeed = 1.0
func _physics_process(delta):
	
	villagerRotationProcess(delta)
func VillagerRotation_SetTargetLocation(new_target: Vector3):
	villagerTargetLocation = new_target
	rotationLerp = 0
	
func villagerRotate(delta):
	if rotationLerp < 1:
		rotationLerp += delta * rotationSpeed
	elif rotationLerp > 1:
		norseMaleVillagerMesh_Spatial.transform.basis = transform.basis.slerp(villagerTargetRotation, rotationLerp).orthonormalized()
		norseMaleVillagerStatus_Spatial.transform.basis = transform.basis.slerp(villagerTargetRotation, rotationLerp).orthonormalized()

func villagerRotationProcess(delta): 
	villagerTargetLocation.y = transform.origin.y
	if villagerTargetLocation != transform.origin:
		villagerTargetRotation = transform.looking_at(villagerTargetLocation, Vector3.UP).basis
		villagerRotate(delta)

That's almost working now which is fantastic, but it's not rotating as potentially instantly as I'd like and I still need to convert the movement direction properly, I think that's why.

You don't need the if statement. You can just set rotationLerp to a value like 0.3 and it will work okay.

Hmmm, need to investigate this code and poke at it some more, I think it's a bit overcomplicated for what I'm try to do and can be tidied up.

@cybereality This is all new code to me so I'm going to have to do some poking at it.

Well that was fast, found the answer.

	if velocity != Vector3.ZERO:
		var lookDirection = atan2(velocity.x, velocity.z)
		rotation.y = lerp (rotation.y, lookDirection, 1 * delta)

Literally all I needed, thought it was being too complicated for what I wanted to do.

    Lethn Now I'm going to have to do stress testing yay LOL 😃