import numpy as np
import pytest
import las_rs
def _read_inline(las_text, **kwargs):
return las_rs.read(las_text, **kwargs)
def _minimal_header(well="INLINE-TEST", null="-999.25"):
return (
"~VERSION INFORMATION\n"
" VERS. 2.0 : LAS VERSION 2.0\n"
" WRAP. NO : ONE LINE PER DEPTH STEP\n"
"~WELL INFORMATION\n"
" STRT.M 1.0 : START\n"
" STOP.M 3.0 : STOP\n"
" STEP.M 1.0 : STEP\n"
f" NULL. {null} : NULL\n"
f" WELL. {well} : WELL\n"
)
@pytest.mark.xfail(reason="not yet implemented")
def test_quoted_strings_in_data():
las_text = (
_minimal_header("QUOTEDTEST")
+ "~CURVE INFORMATION\n"
" DEPT.M : DEPTH\n"
" LITH. : LITHOLOGY\n"
"~ASCII LOG DATA\n"
' 1.0 "pick gamma"\n'
' 2.0 sandstone\n'
' 3.0 shale\n'
)
las = _read_inline(las_text)
lith = las.curves["LITH"].data
assert "pick gamma" in str(lith[0]) or "pick" in str(lith[0])
@pytest.mark.xfail(reason="not yet implemented")
def test_chr26_removal():
las_text = (
_minimal_header("CHR26TEST")
+ "~CURVE INFORMATION\n"
" DEPT.M : DEPTH\n"
" GR .GAPI : GAMMA RAY\n"
"~ASCII LOG DATA\n"
" 1.0 30.5\n"
" 2.0 40.1\x1a\n" " 3.0 50.7\n"
)
las = _read_inline(las_text)
gr = las.curves["GR"].data
assert len(gr) == 3
assert gr[1] == pytest.approx(40.1)
@pytest.mark.xfail(reason="not yet implemented")
def test_comma_decimal_in_params():
las_text = (
_minimal_header("COMMAPARAMS")
+ "~CURVE INFORMATION\n"
" DEPT.M : DEPTH\n"
" GR .GAPI : GAMMA RAY\n"
"~PARAMETER INFORMATION\n"
" BHT .DEGC 72,5 : BOTTOM HOLE TEMPERATURE\n"
"~ASCII LOG DATA\n"
" 1.0 30.5\n"
" 2.0 40.1\n"
" 3.0 50.7\n"
)
las = _read_inline(las_text, read_policy="comma-decimal-mark")
bht_val = las.params["BHT"].value
assert float(str(bht_val).replace(",", ".")) == pytest.approx(72.5)
@pytest.mark.xfail(reason="not yet implemented")
def test_string_data_time_column():
las_text = (
_minimal_header("TIMETEST")
+ "~CURVE INFORMATION\n"
" DEPT.M : DEPTH\n"
" TIME. : TIME OF MEASUREMENT\n"
"~ASCII LOG DATA\n"
" 1.0 00:00:00\n"
" 2.0 00:01:00\n"
" 3.0 00:02:00\n"
)
las = _read_inline(las_text)
time_data = las.curves["TIME"].data
assert len(time_data) == 3
non_nan = [v for v in time_data if str(v) not in ("nan", "")]
assert len(non_nan) == 3
assert "00:00:00" in str(time_data[0])
@pytest.mark.xfail(reason="not yet implemented")
def test_string_data_date_column():
las_text = (
_minimal_header("DATETEST")
+ "~CURVE INFORMATION\n"
" DEPT.M : DEPTH\n"
" DATE. : DATE OF MEASUREMENT\n"
"~ASCII LOG DATA\n"
" 1.0 01-Jan-20\n"
" 2.0 02-Jan-20\n"
" 3.0 03-Jan-20\n"
)
las = _read_inline(las_text)
date_data = las.curves["DATE"].data
assert len(date_data) == 3
non_nan = [v for v in date_data if str(v) not in ("nan", "")]
assert len(non_nan) == 3
assert "Jan" in str(date_data[0])
@pytest.mark.xfail(reason="not yet implemented")
def test_numeric_looking_date():
las_text = (
_minimal_header("ISODATE")
+ "~CURVE INFORMATION\n"
" DEPT.M : DEPTH\n"
" DATE. : ISO DATE\n"
"~ASCII LOG DATA\n"
" 1.0 2020-01-01\n"
" 2.0 2020-01-02\n"
" 3.0 2020-01-03\n"
)
las = _read_inline(las_text)
date_data = las.curves["DATE"].data
first = str(date_data[0])
assert first not in ("2018.0", "2018", "nan")
assert "2020" in first or "01" in first
@pytest.mark.xfail(reason="not yet implemented")
def test_data_characters_pandas_dtypes():
pandas = pytest.importorskip("pandas")
las_text = (
_minimal_header("DTYPETEST")
+ "~CURVE INFORMATION\n"
" DEPT.M : DEPTH\n"
" GR .GAPI : GAMMA RAY\n"
" LITH. : LITHOLOGY\n"
"~ASCII LOG DATA\n"
" 1.0 30.5 sandstone\n"
" 2.0 45.2 shale\n"
" 3.0 60.8 limestone\n"
)
las = _read_inline(las_text)
df = las.df()
assert df["GR"].dtype == np.float64 or np.issubdtype(df["GR"].dtype, np.floating)
assert df["LITH"].dtype == object