Преобразование строки метки времени Unix в читаемую дату
У меня есть строка, представляющая метку времени Unix (то есть "1284101485") в Python, и я хотел бы преобразовать ее в удобочитаемую дату. Когда я использую time.strftime
Я получаю TypeError
:
>>>import time
>>>print time.strftime("%B %d %Y", "1284101485")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument must be 9-item sequence, not str
21 ответ
Использование datetime
модуль:
from datetime import datetime
ts = int("1284101485")
# if you encounter a "year is out of range" error the timestamp
# may be in milliseconds, try `ts /= 1000` in that case
print(datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))
>>> from datetime import datetime
>>> datetime.fromtimestamp(1172969203.1)
datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)
Взято с http://seehuhn.de/pages/pdate
Ответ с наибольшим количеством голосов предлагает использовать метку времени, которая подвержена ошибкам, поскольку она использует местный часовой пояс. Чтобы избежать проблем, лучше использовать UTC:
datetime.datetime.utcfromtimestamp(posix_time).strftime('%Y-%m-%dT%H:%M:%SZ')
Где posix_time - время эпохи Posix, которое вы хотите преобразовать
Есть две части:
- Преобразовать метку времени Unix ("секунды с начала эпохи") в местное время
- Показать местное время в нужном формате.
Портативный способ получить местное время, которое работает, даже если в прошлом местный часовой пояс имел другое смещение utc, а python не имеет доступа к базе данных tz, - это использовать pytz
часовой пояс:
#!/usr/bin/env python
from datetime import datetime
import tzlocal # $ pip install tzlocal
unix_timestamp = float("1284101485")
local_timezone = tzlocal.get_localzone() # get pytz timezone
local_time = datetime.fromtimestamp(unix_timestamp, local_timezone)
Чтобы отобразить его, вы можете использовать любой формат времени, поддерживаемый вашей системой, например:
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))
print(local_time.strftime("%B %d %Y")) # print date in your format
Если вам не нужно местное время, вместо этого получите читаемое время UTC:
utc_time = datetime.utcfromtimestamp(unix_timestamp)
print(utc_time.strftime("%Y-%m-%d %H:%M:%S.%f+00:00 (UTC)"))
Если вас не волнуют проблемы с часовым поясом, которые могут повлиять на возвращаемую дату или если у python есть доступ к базе данных tz в вашей системе:
local_time = datetime.fromtimestamp(unix_timestamp)
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f"))
На Python 3 вы можете получить дату и время с учетом часового пояса, используя только stdlib (смещение UTC может быть неправильным, если у python нет доступа к базе данных tz в вашей системе, например, в Windows):
#!/usr/bin/env python3
from datetime import datetime, timezone
utc_time = datetime.fromtimestamp(unix_timestamp, timezone.utc)
local_time = utc_time.astimezone()
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))
Функции из time
модули являются тонкими обертками вокруг соответствующего C API, и поэтому они могут быть менее переносимыми, чем соответствующие datetime
методы, иначе вы можете использовать их тоже:
#!/usr/bin/env python
import time
unix_timestamp = int("1284101485")
utc_time = time.gmtime(unix_timestamp)
local_time = time.localtime(unix_timestamp)
print(time.strftime("%Y-%m-%d %H:%M:%S", local_time))
print(time.strftime("%Y-%m-%d %H:%M:%S+00:00 (UTC)", utc_time))
>>> import time
>>> time.ctime(int("1284101485"))
'Fri Sep 10 16:51:25 2010'
>>> time.strftime("%D %H:%M", time.localtime(int("1284101485")))
'09/10/10 16:51'
В Python 3.6+:
import datetime
timestamp = 1579117901
value = datetime.datetime.fromtimestamp(timestamp)
print(f"{value:%Y-%m-%d %H:%M:%S}")
Выход
2020-01-15 19:51:41
Объяснение
- Строка №1: Импортировать библиотеку datetime.
- Строка №2: время Unix в секундах с 01.01.1970.
- Строка №3: Преобразует это в объект времени unix, проверьте:
type(value)
- Строка №4: печать в том же формате, что и strp.
Бонус
Чтобы сохранить дату в строке, а затем распечатать ее, используйте это:
my_date = f"{value:%Y-%m-%d %H:%M:%S}"
print(my_date)
Помимо использования пакета время / дата / время, панды также могут быть использованы для решения той же проблемы. Вот как мы можем использовать панд для преобразования метки времени в читаемую дату:
Метки времени могут быть в двух форматах:
13 цифр (миллисекунд) - для преобразования миллисекунд в дату используйте:
import pandas result_ms=pandas.to_datetime('1493530261000',unit='ms') str(result_ms) Output: '2017-04-30 05:31:01'
10 цифр (секунд) - чтобы преобразовать секунды в дату, используйте:
import pandas result_s=pandas.to_datetime('1493530261',unit='s') str(result_s) Output: '2017-04-30 05:31:01'
Для удобочитаемой отметки времени из отметки времени UNIX я использовал это в сценариях ранее:
import os, datetime
datetime.datetime.fromtimestamp(float(os.path.getmtime("FILE"))).strftime("%B %d, %Y")
Выход:
26 декабря 2012 г.
Вы можете конвертировать текущее время, как это
t=datetime.fromtimestamp(time.time())
t.strftime('%Y-%m-%d')
'2012-03-07'
Для преобразования даты в строку в разные форматы.
import datetime,time
def createDateObject(str_date,strFormat="%Y-%m-%d"):
timeStamp = time.mktime(time.strptime(str_date,strFormat))
return datetime.datetime.fromtimestamp(timeStamp)
def FormatDate(objectDate,strFormat="%Y-%m-%d"):
return objectDate.strftime(strFormat)
Usage
=====
o=createDateObject('2013-03-03')
print FormatDate(o,'%d-%m-%Y')
Output 03-03-2013
timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')
Получите читаемую дату из отметки времени вместе со временем, также вы можете изменить формат даты.
Обратите внимание, что
utcfromtimestamp
сбивает с толку и может привести к неожиданным результатам из-за наивного объекта datetime. Лучше быть явным и установить
tz
аргумент в
fromtimestamp
:
from datetime import datetime, timezone
dtobj = datetime.fromtimestamp(1284101485, timezone.utc)
print(dtobj.isoformat())
print(repr(dtobj))
# 2010-09-10T06:51:25+00:00
# datetime.datetime(2010, 9, 10, 6, 51, 25, tzinfo=datetime.timezone.utc)
Отсутствие указания часового пояса (tz) приведет кнаивному datetime, представляющемуместное время, тогда как время UNIX относится к UTC.
Использоватьdatetime.strftime(format)
:
from datetime import datetime
unixtime = int('1284101485')
# Print with local time
print(datetime.fromtimestamp(unixtime).strftime('%Y-%m-%d %H:%M:%S'))
# Print with UTC time
print(datetime.utcfromtimestamp(unixtime).strftime('%Y-%m-%d %H:%M:%S'))
datetime.fromtimestamp(timestamp)
: возвращает локальную дату, соответствующую временной метке POSIX, например, возвращаемуюtime.time()
.datetime.utcfromtimestamp(timestamp)
: вернуть дату и время в формате UTC, соответствующую временной метке POSIX, с tzinfo None. (Результирующий объект наивен.)
Используйте следующие коды, я надеюсь, что это решит вашу проблему.
import datetime as dt
print(dt.datetime.fromtimestamp(int("1284101485")).strftime('%Y-%m-%d %H:%M:%S'))
import datetime
temp = datetime.datetime.fromtimestamp(1386181800).strftime('%Y-%m-%d %H:%M:%S')
print temp
Другой способ сделать это можно с помощью функции gmtime и format;
from time import gmtime
print('{}-{}-{} {}:{}:{}'.format(*gmtime(1538654264.703337)))
Выход: 2018-10-4 11:57:44
Если вы работаете с фреймом данных и НЕ хотите, чтобы "серия не могла быть преобразована в класс int". Используйте ниже.
new_df= pd.to_datetime(df_new['time'], unit='s')
Я просто успешно использовал:
>>> type(tstamp)
pandas.tslib.Timestamp
>>> newDt = tstamp.date()
>>> type(newDt)
datetime.date
Вы можете использовать easy_date, чтобы сделать это легко:
import date_converter
my_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")
Быстрый и грязный лайнер:
'-'.join(str(x) for x in list(tuple(datetime.datetime.now().timetuple())[:6]))
'2013-5-5-1-9-43'
Существует интересный способ, при котором вам не нужно беспокоиться о часовых поясах, utc и т. Д. Просто преобразуйте строку в формат даты Excel, а затем в удобочитаемую дату / время:
import datetime
def xldate_to_datetime(xldate):
temp = datetime.datetime(1899, 12, 30)
delta = datetime.timedelta(days=xldate)
return temp+delta
ts = "1284101485"
tsxl = ((int(ts)/60)/60)/24 + 25569
readabledate = xldate_to_datetime(tsxl)
print(readabledate)
Вы смотрели на пакет datetime? Я считаю, что у него есть метод fromUnixTimestamp.