Как преобразовать целое число в объект даты python?

Я создаю модуль в python, в котором я получаю дату в целочисленном формате, например 20120213, что означает 13 февраля 2012 года. Теперь я хочу преобразовать эту дату в целочисленном формате в объект даты python.

Кроме того, есть ли какие-либо средства, с помощью которых я могу вычесть/добавить количество дней в такой целочисленной дате, чтобы получить значение даты в том же формате? например, вычесть 30 дней из 20120213 и получить ответ как 20120114?


person Uday0119    schedule 17.03.2012    source источник


Ответы (4)


Я бы предложил следующий простой подход для преобразования:

from datetime import datetime, timedelta
s = "20120213"
# you could also import date instead of datetime and use that.
date = datetime(year=int(s[0:4]), month=int(s[4:6]), day=int(s[6:8]))

Для добавления/вычитания произвольного количества дней (кстати, секунды тоже работают), вы можете сделать следующее:

date += timedelta(days=10)
date -= timedelta(days=5)

И конвертируйте обратно, используя:

s = date.strftime("%Y%m%d")

Чтобы безопасно преобразовать целое число в строку, используйте:

s = "{0:-08d}".format(i)

Это гарантирует, что ваша строка имеет длину восемь символов и дополняется нулями слева, даже если год меньше 1000 (хотя отрицательные годы могут стать забавными).

Дополнительная ссылка: объекты даты и времени, объекты timedelta

person Jonas Schäfer    schedule 17.03.2012
comment
но то, что я получаю, не является строкой. это целое число - person Uday0119; 17.03.2012
comment
ну это не сложно, вы можете использовать str(x) для преобразования целого числа в строку. - person Peter; 17.03.2012
comment
@peter: хорошо... спасибо за предложение - person Uday0119; 17.03.2012
comment
@ Uday0119: Я добавил предложение, как сделать это правильно даже для маленьких лет. - person Jonas Schäfer; 17.03.2012
comment
да, @JonasWielicki... спасибо за обновленную информацию... это, безусловно, мне очень помогло... - person Uday0119; 17.03.2012

На этот вопрос уже дан ответ, но для пользы других, рассматривающих этот вопрос, я хотел бы добавить следующее предложение: вместо самостоятельного нарезки, как было предложено выше, вы также можете использовать strptime(), который (ИМХО) легче читать и, возможно, является предпочтительным способом выполнения этого преобразования.

import datetime
s = "20120213"
s_datetime = datetime.datetime.strptime(s, '%Y%m%d')
person W.Prins    schedule 24.06.2012
comment
Как насчет серии панд, состоящей из похожих строк/целых чисел, таких как 20120203? - person dejoma; 03.10.2018
comment
@ 1dhiman, это формат, который я использую, но я считаю, что он все еще очень медленный для больших наборов данных. Есть ли способ ускорить его в пандах? - person iYOA; 16.06.2021

Вот что я считаю ответом на вопрос (Python 3, с подсказками типа):

from datetime import date


def int2date(argdate: int) -> date:
    """
    If you have date as an integer, use this method to obtain a datetime.date object.

    Parameters
    ----------
    argdate : int
      Date as a regular integer value (example: 20160618)

    Returns
    -------
    dateandtime.date
      A date object which corresponds to the given value `argdate`.
    """
    year = int(argdate / 10000)
    month = int((argdate % 10000) / 100)
    day = int(argdate % 100)

    return date(year, month, day)


print(int2date(20160618))

Приведенный выше код создает ожидаемый 2016-06-18.

person DejanLekic    schedule 07.06.2016
comment
Я не знаю, как это работает (я подозреваю черную магию), но это работает! Поскольку это единственный ответ, который на самом деле отвечает на ОП, он должен быть принятым ответом. - person Caltor; 22.09.2018

import datetime

timestamp = datetime.datetime.fromtimestamp(1500000000)

print(timestamp.strftime('%Y-%m-%d %H:%M:%S'))

Это даст результат:

2017-07-14 08:10:00
person Raghav Mehra    schedule 03.02.2021
comment
это было очень полезно большое спасибо! - person Karmavil; 08.05.2021