提问人:VeryNewToPython 提问时间:9/10/2010 最后编辑:kabr8VeryNewToPython 更新时间:6/10/2022 访问量:1606237
将 unix 时间戳字符串转换为可读日期
Converting unix timestamp string to readable date
问:
我在 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
答:
>>> from datetime import datetime
>>> datetime.fromtimestamp(1172969203.1)
datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)
摘自 http://seehuhn.de/pages/pdate
评论
print(datetime.utcfromtimestamp(unix_time_value)
使用模块: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'))
评论
.fromtimestamp()
如果本地时区具有不同的 UTC 偏移量,则过去的日期可能会失败。您需要一个历史时区数据库,例如由模块(或您的操作系统)提供。或者只是在UTC中工作并使用.pytz
.utcfromtimestamp()
pytz
了pytz
解决方案。
>>> 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'
评论
time.ctime()
如果本地时区具有不同的 UTC 偏移量,则过去的日期可能会失败。您需要一个历史时区数据库,例如由模块(或您的操作系统)提供。或者只是在UTC中工作并使用. 可能会提供更宽的日期范围,因此可以代替函数使用。time.localtime()
pytz
time.gmtime()
datetime
datetime.utcfromtimestamp()
time
您可以像这样转换当前时间
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-5-1-9-43'
评论
import datetime
temp = 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_converter
my_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")
评论
strptime
而且不直观......甚至不可读......但我理解并尊重你的意见strftime
得票最多的答案建议使用 fromtimestamp,因为它使用本地时区,因此容易出错。为了避免问题,更好的方法是使用 UTC:
datetime.datetime.utcfromtimestamp(posix_time).strftime('%Y-%m-%dT%H:%M:%SZ')
其中posix_time是要转换的 Posix 纪元时间
评论
TZ=right/UTC date
TZ=UTC date
Mon 7 Sep 15:58:05 UTC 2020
Mon 7 Sep 15:58:32 UTC 2020
ValueError: year 53085 is out of range
分为两部分:
- 将 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 获得时区感知的日期时间(如果 python 无法访问系统上的 tz 数据库,例如在 Windows 上,则 UTC 偏移量可能是错误的):
#!/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)"))
该模块中的函数是围绕相应 C API 的精简包装器,因此它们的可移植性可能不如相应的方法,否则您也可以使用它们:time
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))
评论
.timestamp()
除了使用 time/datetime 包外,pandas 还可以用于解决相同的问题。以下是我们如何使用 pandas 将时间戳转换为可读日期:
时间戳可以采用两种格式:
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'
timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')
从带有时间的时间戳中获取可读日期,您也可以更改日期的格式。
评论
另一种方法可以使用 gmtime 和 format 函数来完成此操作;
from time import gmtime
print('{}-{}-{} {}:{}:{}'.format(*gmtime(1538654264.703337)))
输出:2018-10-4 11:57:44
在 Python 3.6+ 中:
import datetime
timestamp = 1642445213
value = datetime.datetime.fromtimestamp(timestamp)
print(f"{value:%Y-%m-%d %H:%M:%S}")
输出(当地时间)
2022-01-17 20:46:53
解释
- 第 #1 行:导入日期时间库。
- 第 #2 行:Unix 时间,自 1970-01-01 以来的秒数。
- 第 #3 行:将其转换为 unix 时间对象,检查:
type(value)
- 第 #4 行:以与 strp 相同的格式打印。当地时间。要以 UTC 打印,请参阅下面的示例。
奖金
要将日期保存到字符串中然后打印,请使用以下命令:
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
评论
tz
fromtimestamp
datetime.timezone.utc
请注意,这可能会导致意外结果,因为它返回一个幼稚的 datetime 对象。Python 将朴素的日期时间视为本地时间,而 UNIX 时间是指 UTC。utcfromtimestamp
这种歧义可以通过在以下位置设置参数来避免:tz
fromtimestamp
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')
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):
返回 POSIX 时间戳对应的 UTC 日期时间,tzinfo 为 None。(生成的对象是幼稚的。
上一个:如何从日期中减去一天?
评论