Есть ли способ установить число равным дате в python? - PullRequest
0 голосов
/ 29 января 2020

У меня есть несколько файлов, которые имеют случайно сгенерированное число, соответствующее дате:

736815 = 01/05/2018

Мне нужно создать функцию или процесс, который применяет logi c к последовательным числам, чтобы следующий число равно следующей календарной дате.

В идеале мне нужно это в формате ключ: пара, чтобы при преобразовании файла в новый формат я мог применить дату вместо автоматического имени файла.

Надеюсь, это имеет больше смысла, его нужно использовать для именования преобразованного файла.

Ответы [ 3 ]

2 голосов
/ 29 января 2020

Число не нужно переводить на дату напрямую. Вам просто нужно выбрать дату начала и номер и добавить другой номер либо простым добавлением, либо с помощью timedelta:

from datetime import date, timedelta
from random import randint

start_date = date.today()
start_int = randint(1000, 10000)

for i in range(10):
    print(start_int + i, start_date + timedelta(days=i))
6964 2020-01-29
6965 2020-01-30
6966 2020-01-31
6967 2020-02-01
6968 2020-02-02
6969 2020-02-03
6970 2020-02-04
6971 2020-02-05
6972 2020-02-06
6973 2020-02-07

Если вы получаете список номеров откуда-то иначе, добавьте / вычтите соответственно из начальной int / date для того же эффекта.

2 голосов
/ 29 января 2020

Я думаю, здесь можно использовать параметр origin, также добавьте unit='D' к to_datetime:

df = pd.DataFrame({'col':[5678, 5679, 5680]})

df['date'] = pd.to_datetime(df['col'] - 5678, unit='D', origin=pd.Timestamp('2020-01-01'))
print (df)
    col       date
0  5678 2020-01-01
1  5679 2020-01-02
2  5680 2020-01-03

Не pandas раствор, только чистый python с той же идеей:

from datetime import datetime, timedelta
L = [5678, 5679, 5680]

a = [timedelta(x-5678) + datetime(2020,1,1)  for x in L]
print (a)
[datetime.datetime(2020, 1, 1, 0, 0), 
 datetime.datetime(2020, 1, 2, 0, 0), 
 datetime.datetime(2020, 1, 3, 0, 0)]
1 голос
/ 29 января 2020

Другое решение заключается в создании объекта, который включает в себя дату и базовый номер для подсчета. Каждый вызов этого объекта (реализованный с использованием специального метода __call__) создает новый объект даты с использованием разницы во времени между базовым номером и предоставленным номером.

import datetime


class RelativeDate:
    def __init__(self, date, base):
        self.date = date
        self.base = base

    def __call__(self, number):
        delta = datetime.timedelta(days=number - self.base)
        return self.date + delta


def create_base_date(number, date):
    return RelativeDate(
        date=datetime.datetime.strptime(date, '%d/%m/%Y'),
        base=number,
    )


base_date = create_base_date(1, '03/01/2020')
base_date(3)

datetime.datetime ( 2020, 1, 5, 0, 0)


Пример фрагмента:

base_date = create_base_date(1, '03/01/2020')
{i: base_date(i) for i in range(1, 10)}

Вывод:

{1: datetime.datetime(2020, 1, 3, 0, 0),
 2: datetime.datetime(2020, 1, 4, 0, 0),
 3: datetime.datetime(2020, 1, 5, 0, 0),
 4: datetime.datetime(2020, 1, 6, 0, 0),
 5: datetime.datetime(2020, 1, 7, 0, 0),
 6: datetime.datetime(2020, 1, 8, 0, 0),
 7: datetime.datetime(2020, 1, 9, 0, 0),
 8: datetime.datetime(2020, 1, 10, 0, 0),
 9: datetime.datetime(2020, 1, 11, 0, 0)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...