Python извлечь дату и время из пути S3 - PullRequest
1 голос
/ 26 мая 2020

Добрый день!

У меня есть путь S3 в следующем формате:
s3: // test-bucket / test / AUS / int1 / DATA / table1 / effective_at_year = 2019 / effective_at_month = 12 / ndh_effective_at_day = 12 / ndh_effective_at_hour = 03 / ndh_effective_at_minute = 42 /
Я хотел бы извлечь дату / время из указанного выше пути и сделать его строкой.
Я использовал приведенный ниже код и добился желаемого результата, но Я хотел бы знать, есть ли какой-нибудь эффективный метод для того, что я реализовал.

    pth=s3://test-bucket/test/AUS/int1/DATA/table1/effective_at_year=2019/effective_at_month=12/ndh_effective_at_day=12/ndh_effective_at_hour=03/ndh_effective_at_minute=42/
    pth1=pth.split("=")[1:]
    res = [int(sub.split('/')[0]) for sub in pth1]
     '-'.join(str(dt) for dt in res[:3])+' '+':'.join(str(dt) for dt in res[3:])
    output: '2019-12-12 3:42'

Ваши входы будут очень признательны. Спасибо

Ответы [ 3 ]

1 голос
/ 26 мая 2020

Я не знаю более подробной информации об AS3, только для части datetime. Вы можете просто использовать datetime.strptime.

from datetime import datetime
print(datetime.strptime('/test/AUS/int1/DATA/table1/effective_at_year=2019/effective_at_month=12/ndh_effective_at_day=12/ndh_effective_at_hour=03/ndh_effective_at_minute=42/',
                        '/test/AUS/int1/DATA/table1/effective_at_year=%Y/effective_at_month=%m/ndh_effective_at_day=%d/ndh_effective_at_hour=%H/ndh_effective_at_minute=%M/'))

Конечно, сначала вам следует удалить префикс. Для URL-адресов разрешения вы можете использовать urllib.parse.urlparse

from urllib.parse import urlparse
print(urlparse('s3://test-bucket/test/AUS/int1/DATA/table1/effective_at_year=2019/effective_at_month=12/ndh_effective_at_day=12/ndh_effective_at_hour=03/ndh_effective_at_minute=42/').path)
1 голос
/ 26 мая 2020

Вы можете использовать regex для извлечения дат:

import re
from datetime import datetime

test_str = "s3://test-bucket/test/AUS/int1/DATA/table1/effective_at_year=2019/effective_at_month=12/ndh_effective_at_day=12/ndh_effective_at_hour=03/ndh_effective_at_minute=42/"

regex = r"=(\d+)\/"

values = [
  int(match.group(1))
  for match in re.finditer(regex, test_str)
]

date = datetime(*values)
formated_date = date.strftime("%Y-%m-%d %H:%M")
print(formated_date)  # prints 2019-12-12 03:42
1 голос
/ 26 мая 2020

Вот пример того, как проанализировать и создать объект datetime с результатом:

import datetime

pth = "s3://test-bucket/test/AUS/int1/DATA/table1/effective_at_year=2019/effective_at_month=12/ndh_effective_at_day=12/ndh_effective_at_hour=03/ndh_effective_at_minute=42/"

# collect datetime components
# - assumes components are in the appropriate order
datetime_components = []
for field in pth.split('/'):
    if "=" in field:
        key, value = field.split("=")
        datetime_components.append((key, value))

result_datetime = datetime.datetime(*[int(v) for _, v in datetime_components])

* здесь оператор распаковывает список, предоставляя результаты как позиционные аргументы конструктору datetime.datetime() :

result_datetime = datetime.datetime(*[int(v) for _, v in datetime_components])

# is equivalent to

desired_components = [int(v) for _, v in datetime_components]
result_datetime = datetime.datetime(desired_components[0], desired_components[1], desired_components[2], desired_components[3], desired_components[4])

Как только вы поместите его в объект datetime, вы можете легко манипулировать им по своему усмотрению.

# 2019-12-12 3:42
result_datetime.strftime("%Y-%m-%d %H:%M")

'2019-12-12 03:42 '

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...