|
10 | 10 | from classes.sdd_reason_for_change_type import SDDReasonForChangeType |
11 | 11 | from classes.ss_reason_for_change_type import SSReasonForChangeType |
12 | 12 | from classes.ssdd_reason_for_change_type import SSDDReasonForChangeType |
| 13 | +from utils.date_time_utils import DateTimeUtils |
13 | 14 | import pandas as pd |
14 | 15 |
|
15 | 16 |
|
@@ -1256,100 +1257,48 @@ def from_dataframe_row(row: pd.Series) -> "Subject": |
1256 | 1257 | "nhs_number": row.get("subject_nhs_number"), |
1257 | 1258 | "surname": row.get("person_family_name"), |
1258 | 1259 | "forename": row.get("person_given_name"), |
1259 | | - "datestamp": Subject.parse_datetime(row.get("datestamp")), |
| 1260 | + "datestamp": DateTimeUtils.parse_datetime(row.get("datestamp")), |
1260 | 1261 | "screening_status_id": row.get("screening_status_id"), |
1261 | 1262 | "screening_status_change_reason_id": row.get("ss_reason_for_change_id"), |
1262 | | - "screening_status_change_date": Subject.parse_date( |
| 1263 | + "screening_status_change_date": DateTimeUtils.parse_date( |
1263 | 1264 | row.get("screening_status_change_date") |
1264 | 1265 | ), |
1265 | | - "screening_due_date": Subject.parse_date(row.get("screening_due_date")), |
| 1266 | + "screening_due_date": DateTimeUtils.parse_date( |
| 1267 | + row.get("screening_due_date") |
| 1268 | + ), |
1266 | 1269 | "screening_due_date_change_reason_id": row.get("sdd_reason_for_change_id"), |
1267 | | - "screening_due_date_change_date": Subject.parse_date( |
| 1270 | + "screening_due_date_change_date": DateTimeUtils.parse_date( |
1268 | 1271 | row.get("sdd_change_date") |
1269 | 1272 | ), |
1270 | | - "calculated_screening_due_date": Subject.parse_date( |
| 1273 | + "calculated_screening_due_date": DateTimeUtils.parse_date( |
1271 | 1274 | row.get("calculated_sdd") |
1272 | 1275 | ), |
1273 | | - "surveillance_screening_due_date": Subject.parse_date( |
| 1276 | + "surveillance_screening_due_date": DateTimeUtils.parse_date( |
1274 | 1277 | row.get("surveillance_screen_due_date") |
1275 | 1278 | ), |
1276 | | - "calculated_surveillance_due_date": Subject.parse_date( |
| 1279 | + "calculated_surveillance_due_date": DateTimeUtils.parse_date( |
1277 | 1280 | row.get("calculated_ssdd") |
1278 | 1281 | ), |
1279 | 1282 | "surveillance_due_date_change_reason_id": row.get( |
1280 | 1283 | "surveillance_sdd_rsn_change_id" |
1281 | 1284 | ), |
1282 | | - "surveillance_due_date_change_date": Subject.parse_date( |
| 1285 | + "surveillance_due_date_change_date": DateTimeUtils.parse_date( |
1283 | 1286 | row.get("surveillance_sdd_change_date") |
1284 | 1287 | ), |
1285 | | - "lynch_due_date": Subject.parse_date(row.get("lynch_screening_due_date")), |
| 1288 | + "lynch_due_date": DateTimeUtils.parse_date( |
| 1289 | + row.get("lynch_screening_due_date") |
| 1290 | + ), |
1286 | 1291 | "lynch_due_date_change_reason_id": row.get( |
1287 | 1292 | "lynch_sdd_reason_for_change_id" |
1288 | 1293 | ), |
1289 | | - "lynch_due_date_change_date": Subject.parse_date( |
| 1294 | + "lynch_due_date_change_date": DateTimeUtils.parse_date( |
1290 | 1295 | row.get("lynch_sdd_change_date") |
1291 | 1296 | ), |
1292 | | - "calculated_lynch_due_date": Subject.parse_date( |
| 1297 | + "calculated_lynch_due_date": DateTimeUtils.parse_date( |
1293 | 1298 | row.get("lynch_calculated_sdd") |
1294 | 1299 | ), |
1295 | | - "date_of_birth": Subject.parse_date(row.get("date_of_birth")), |
1296 | | - "date_of_death": Subject.parse_date(row.get("date_of_death")), |
| 1300 | + "date_of_birth": DateTimeUtils.parse_date(row.get("date_of_birth")), |
| 1301 | + "date_of_death": DateTimeUtils.parse_date(row.get("date_of_death")), |
1297 | 1302 | } |
1298 | 1303 |
|
1299 | 1304 | return Subject(**field_map) |
1300 | | - |
1301 | | - @staticmethod |
1302 | | - def parse_date( |
1303 | | - val: Optional[Union[pd.Timestamp, str, datetime, date]], |
1304 | | - ) -> Optional[date]: |
1305 | | - """ |
1306 | | - Converts a value to a Python date object if possible. |
1307 | | -
|
1308 | | - Args: |
1309 | | - val: The value to convert (can be pandas.Timestamp, string, datetime, date, or None). |
1310 | | -
|
1311 | | - Returns: |
1312 | | - Optional[date]: The converted date object, or None if conversion fails. |
1313 | | - """ |
1314 | | - if pd.isnull(val): |
1315 | | - return None |
1316 | | - if isinstance(val, pd.Timestamp): |
1317 | | - return val.to_pydatetime().date() |
1318 | | - if isinstance(val, str): |
1319 | | - try: |
1320 | | - return datetime.strptime(val[:10], "%Y-%m-%d").date() |
1321 | | - except Exception: |
1322 | | - return None |
1323 | | - if isinstance(val, datetime): |
1324 | | - return val.date() |
1325 | | - if isinstance(val, date): |
1326 | | - return val |
1327 | | - return None |
1328 | | - |
1329 | | - @staticmethod |
1330 | | - def parse_datetime( |
1331 | | - val: Optional[Union[pd.Timestamp, str, datetime, date]], |
1332 | | - ) -> Optional[datetime]: |
1333 | | - """ |
1334 | | - Converts a value to a Python datetime object if possible. |
1335 | | -
|
1336 | | - Args: |
1337 | | - val: The value to convert (can be pandas.Timestamp, string, datetime, or None). |
1338 | | -
|
1339 | | - Returns: |
1340 | | - Optional[datetime]: The converted datetime object, or None if conversion fails. |
1341 | | - """ |
1342 | | - if pd.isnull(val): |
1343 | | - return None |
1344 | | - if isinstance(val, pd.Timestamp): |
1345 | | - return val.to_pydatetime() |
1346 | | - if isinstance(val, str): |
1347 | | - for fmt in ("%Y-%m-%d %H:%M:%S", "%Y-%m-%dT%H:%M:%S"): |
1348 | | - try: |
1349 | | - return datetime.strptime(val[:19], fmt) |
1350 | | - except Exception: |
1351 | | - continue |
1352 | | - return None |
1353 | | - if isinstance(val, datetime): |
1354 | | - return val |
1355 | | - return None |
0 commit comments