将unix时间戳字符串转换为可读日期

我有一个字符串表示Python中的unix时间戳(即“1284101485”),我想将其转换为可读的日期。当我使用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
1500348 次浏览
>>> from datetime import datetime>>> datetime.fromtimestamp(1172969203.1)datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)

取自http://seehuhn.de/pages/pdate

使用datetime模块:

from datetime import datetimets = int('1284101485')
# if you encounter a "year is out of range" error the timestamp# may be in milliseconds, try `ts /= 1000` in that caseprint(datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))
>>> 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'

您可以像这样转换当前时间

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

对于来自UNIX时间戳的人类可读时间戳,我以前在脚本中使用过:

import os, datetime
datetime.datetime.fromtimestamp(float(os.path.getmtime("FILE"))).strftime("%B %d, %Y")

输出:

2012年12月26日

快速和肮脏的一个衬垫:

'-'.join(str(x) for x in list(tuple(datetime.datetime.now().timetuple())[:6]))

'2013-5-1-9-43'

import datetimetemp = datetime.datetime.fromtimestamp(1386181800).strftime('%Y-%m-%d %H:%M:%S')print temp

我刚刚成功使用:

>>> type(tstamp)pandas.tslib.Timestamp>>> newDt = tstamp.date()>>> type(newDt)datetime.date

您可以使用easy_date使其更容易:

import date_convertermy_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")

投票最多的答案建议使用Fromtimestam,这很容易出错,因为它使用本地时区。为了避免问题,更好的方法是使用UTC:

datetime.datetime.utcfromtimestamp(posix_time).strftime('%Y-%m-%dT%H:%M:%SZ')

posix_time是您要转换的波西纪元时间

有两个部分:

  1. 将unix时间戳(“自纪元以来的秒”)转换为本地时间
  2. 以所需格式显示本地时间。

即使本地时区过去有不同的utc偏移量并且python无法访问tz数据库,也可以使用pytz时区来获取有效的本地时间:

#!/usr/bin/env pythonfrom datetime import datetimeimport tzlocal  # $ pip install tzlocal
unix_timestamp = float("1284101485")local_timezone = tzlocal.get_localzone() # get pytz timezonelocal_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获得时区感知的datetime(如果python无法访问系统上的tz数据库,例如在Windows上,UTC偏移可能是错误的):

#!/usr/bin/env python3from 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 pythonimport 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))

除了使用时间/日期包,熊猫也可以用来解决同样的问题。以下是我们如何使用熊猫时间戳转换为可读日期

时间戳可以是两种格式:

  1. 13位(毫秒)-要将毫秒转换为日期,请使用:

    import pandasresult_ms=pandas.to_datetime('1493530261000',unit='ms')str(result_ms)
    Output: '2017-04-30 05:31:01'
  2. 10 digits(seconds) -To convert seconds to date, use:

    import pandasresult_s=pandas.to_datetime('1493530261',unit='s')str(result_s)
    Output: '2017-04-30 05:31:01'
timestamp ="124542124"value = datetime.datetime.fromtimestamp(timestamp)exct_time = value.strftime('%d %B %Y %H:%M:%S')

从带有时间的时间戳中获取可读日期,您还可以更改日期的格式。

另一种方式,这可以使用GMTime和格式功能来完成;

from time import gmtimeprint('{}-{}-{} {}:{}:{}'.format(*gmtime(1538654264.703337)))

输出:2018-10-4 11:57:44

在Python 3.6+中:

import datetime
timestamp = 1642445213value = datetime.datetime.fromtimestamp(timestamp)print(f"{value:%Y-%m-%d %H:%M:%S}")

输出(当地时间)

2022-01-17 20:46:53

补充说明

奖金

要将日期保存为字符串然后打印它,请使用以下命令:

my_date = f"{value:%Y-%m-%d %H:%M:%S}"print(my_date)

以UTC格式输出:

value = datetime.datetime.fromtimestamp(timestamp, tz=datetime.timezone.utc)# 2022-01-17 18:50:52

请注意,utcfromtimestamp可能导致意想不到的结果,因为它返回一个朴素的datetime对象。Python将朴素的datetime视为当地时间-而UNIX时间指的是UTC。

可以通过在fromtimestamp中设置tz参数来避免这种歧义:

from datetime import datetime, timezone
dtobj = datetime.fromtimestamp(1284101485, timezone.utc)
>>> print(repr(dtobj))datetime.datetime(2010, 9, 10, 6, 51, 25, tzinfo=datetime.timezone.utc)

现在您可以格式化为字符串,例如符合ISO8601的格式:

>>> print(dtobj.isoformat(timespec='milliseconds').replace('+00:00', 'Z'))2010-09-10T06:51:25.000Z

使用以下代码,我希望它能解决你的问题。

import datetime as dt
print(dt.datetime.fromtimestamp(int("1284101485")).strftime('%Y-%m-%d %H:%M:%S'))

如果您正在使用数据框并且不要想要series cannot be converted to class int错误。使用下面的代码。

new_df= pd.to_datetime(df_new['time'], unit='s')

使用#0

from datetime import datetimeunixtime = int('1284101485')
# Print with local timeprint(datetime.fromtimestamp(unixtime).strftime('%Y-%m-%d %H:%M:%S'))
# Print with UTC timeprint(datetime.utcfromtimestamp(unixtime).strftime('%Y-%m-%d %H:%M:%S'))
  • #0:返回POSIX时间戳对应的本地日期,例如time.time()返回的日期。

  • #0:返回对应于POSIX时间戳的UTC日期时间,tzinfo无。(结果对象是朴素的。)