Is there a way to estimate a behavior policy from this dataset so that it can be used in an off-policy learning algorithm?
If you have enough examples of $(s,a)$ pairs for each instance of $s$ then you can simply estimate
$$b(a|s) = \frac{N(a,s)}{N(s)}$$
Where $N$ counts the number of instances in your dataset. This might be enough to use off-policy with importance sampling.
Alternatively, you can use an off-policy approach that doesn't need importance sampling. The most straightforward one here would be single-step Q learning. The update step for 1-step Q-learning does not depend on behaviour policy, because:
The action value being updated $Q(s,a)$ already assumes $a$ is being taken, so you don't need any conditional probability there.
The TD target $r + \gamma \text{max}_{a'}[Q(s',a')]$ does not need to be adjusted for behaviour policy, it works with the target policy directly (implied as $\pi(s) = \text{argmax}_{a}[Q(s,a)]$)
A 2-step Q learning algorithm would need to adjust for likelihood $b(a'|s')$ in the TD target $\frac{\pi(a'|s')}{b(a'|s')}(r + \gamma r' + \gamma^2\text{max}_{a''}[Q(s'',a'')])$ - typically $\pi(a'|s')$ is either 0 or 1, thus making $b(a'|s')$ irrelevant some of the time. But you would still prefer to know it for performing updates it you can.
If you are making updates offline and off-policy, then single-step Q learning is probably the simplest approach. It will require more update steps overall to reach convergence, but each one will be simpler.