在Python中将字符串日期转换为时间戳

Sha*_*bus 193 python datetime

如何将格式的字符串转换"%d/%m/%Y"为时间戳?

"01/12/2011" -> 1322697600
Run Code Online (Sandbox Code Playgroud)

Kat*_*iel 283

>>> import time
>>> import datetime
>>> s = "01/12/2011"
>>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple())
1322697600.0
Run Code Online (Sandbox Code Playgroud)

  • `datetime.datetime.strptime(s,"%d /%m /%Y").timestamp()`有点短 (41认同)
  • 它假设在当地时区的午夜01/12/2011.如果输入是UTC; 你可以使用[`calendar.timegm()`或`.toordinal()`](http://stackoverflow.com/a/20035328/4279) (9认同)
  • @timdiels:再次.如果没有给出明确的时区,`.timestamp()`假设*local*time而不是UTC.答案中的代码仅在本地时区具有零utc偏移量的计算机上工作(产生预期的"1322697600"). (9认同)
  • 这不起作用:datetime.datetime.strptime("2014:06:28 11:53:21","%Y:%m:%d%H:%M:%S").timestamp()Traceback(最近一次调用last):文件"<stdin>",第1行,<module> AttributeError:'datetime.datetime'对象没有属性'timestamp' (5认同)
  • @ZdenekMaxa datetime.timestamp()仅适用于python> = 3.3版本.https://docs.python.org/3/whatsnew/3.3.html (4认同)
  • @kenorb:这是不对的.`mktime()`需要当地时间,但是你要经过时间.它与此答案具有相同的问题:除非本地时区的utc偏移为零,否则会产生错误的结果. (2认同)

jfs*_*jfs 38

要将字符串转换为日期对象:

from datetime import date, datetime

date_string = "01/12/2011"
date_object = date(*map(int, reversed(date_string.split("/"))))
assert date_object == datetime.strptime(date_string, "%d/%m/%Y").date()
Run Code Online (Sandbox Code Playgroud)

将日期对象转换为POSIX时间戳的方法取决于时区.从Python中的转换datetime.date为UTC时间戳:

  • date对象表示UTC的午夜

    import calendar
    
    timestamp1 = calendar.timegm(utc_date.timetuple())
    timestamp2 = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * 24*60*60
    assert timestamp1 == timestamp2
    
    Run Code Online (Sandbox Code Playgroud)
  • date对象表示当地时间的午夜

    import time
    
    timestamp3 = time.mktime(local_date.timetuple())
    assert timestamp3 != timestamp1 or (time.gmtime() == time.localtime())
    
    Run Code Online (Sandbox Code Playgroud)

除非UTC中的午夜和本地时间是同一时间实例,否则时间戳是不同的.

  • 这是最完整和最有用的,谢谢 (2认同)

Eya*_* Ch 36

我使用的ciso8601,比datetime的strptime快62倍.

t = "01/12/2011"
ts = ciso8601.parse_datetime(t)
# to get time in seconds:
time.mktime(ts.timetuple())
Run Code Online (Sandbox Code Playgroud)

你可以在这里了解更多.

  • 这是一个绝妙的建议。我只是使用它并减少了我执行的时间。 (4认同)
  • 我的天,这真快 (4认同)
  • 并且 +1 表示不需要我说明时间字符串格式是什么。 (4认同)

San*_*4ez 28

>>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s"))
1322683200
Run Code Online (Sandbox Code Playgroud)

  • Python不支持[`"%s"`(http://stackoverflow.com/q/17433056/4279).它不便携. (10认同)

Now*_*kus 21

答案还取决于您输入的日期时区.如果你的日期是本地日期,那么你可以使用像katrielalex所说的mktime() - 只是我不明白为什么他使用datetime而不是这个更短的版本:

>>> time.mktime(time.strptime('01/12/2011', "%d/%m/%Y"))
1322694000.0
Run Code Online (Sandbox Code Playgroud)

但请注意我的结果与他不同,因为我可能在不同的TZ中(结果是无时区的UNIX时间戳)

现在,如果输入日期已经是UTC,那么我认为正确的解决方案是:

>>> calendar.timegm(time.strptime('01/12/2011', '%d/%m/%Y'))
1322697600
Run Code Online (Sandbox Code Playgroud)


nm1*_*111 12

只需使用datetime.datetime.strptime

import datetime
stime = "01/12/2011"
print(datetime.datetime.strptime(stime, "%d/%m/%Y").timestamp())
Run Code Online (Sandbox Code Playgroud)

结果:

1322697600
Run Code Online (Sandbox Code Playgroud)

要使用UTC代替本地时区,请使用.replace

datetime.datetime.strptime(stime, "%d/%m/%Y").replace(tzinfo=datetime.timezone.utc).timestamp()
Run Code Online (Sandbox Code Playgroud)

  • 对于完整的答案,您必须说它仅对 python 3.3+ 有效 (2认同)

alf*_*edo 9

我会给初学者(比如我)一个答案:

你有日期字符串"01/12/2011"。然后就可以按照格式来写了"%d/%m/%Y"。如果您想格式化为其他格式,例如"July 9, 2015"这里有一个很好的备忘单。

  • 导入datetime库。

  • 使用该类datetime.datetime来处理日期和时间组合。

  • 使用该strptime方法将字符串日期时间转换为对象日期时间。

  • 最后,使用该timestamp方法获取浮点数形式的 Unix 纪元时间。所以,

import datetime
print( int( datetime.datetime.strptime( "01/12/2011","%d/%m/%Y" ).timestamp() ) )

# prints 1322712000
Run Code Online (Sandbox Code Playgroud)


Cry*_*ite 6

首先,您必须使用strptime类将字符串转换为struct_time格式.

然后从那里使用mktime来获得你的浮动.


tör*_*kus 6

我建议dateutil:

import dateutil.parser
dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp()
Run Code Online (Sandbox Code Playgroud)

  • 除非您的本地时区是 UTC,否则它不会产生预期的“1322697600”。参见 [我 2014 年的评论](/sf/ask/674648691/#comment34554753_9637908) (2认同)

MrE*_*MrE 5

这些答案中有很多都不必考虑日期是幼稚的

为正确起见,您需要先将朴素日期设为可识别时区的日期时间

import datetime
import pytz
# naive datetime
d = datetime.datetime.strptime('01/12/2011', '%d/%m/%Y')
>>> datetime.datetime(2011, 12, 1, 0, 0)

# add proper timezone
pst = pytz.timezone('America/Los_Angeles')
d = pst.localize(d)
>>> datetime.datetime(2011, 12, 1, 0, 0,
tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)

# convert to UTC timezone
utc = pytz.UTC
d = d.astimezone(utc)
>>> datetime.datetime(2011, 12, 1, 8, 0, tzinfo=<UTC>)

# epoch is the beginning of time in the UTC timestamp world
epoch = datetime.datetime(1970,1,1,0,0,0,tzinfo=pytz.UTC)
>>> datetime.datetime(1970, 1, 1, 0, 0, tzinfo=<UTC>)

# get the total second difference
ts = (d - epoch).total_seconds()
>>> 1322726400.0
Run Code Online (Sandbox Code Playgroud)

也:

请注意,在许多时区中都使用pytz“ 不工作”。请参阅带有pytz时区的datetime。不同的偏移量取决于tzinfo的设置方式tzinfodatetime.datetime

# Don't do this:
d = datetime.datetime(2011, 12, 1,0,0,0, tzinfo=pytz.timezone('America/Los_Angeles'))
>>> datetime.datetime(2011, 1, 12, 0, 0, 
tzinfo=<DstTzInfo 'America/Los_Angeles' LMT-1 day, 16:07:00 STD>)
# tzinfo in not PST but LMT here, with a 7min offset !!!

# when converting to UTC:
d = d.astimezone(pytz.UTC)
>>> datetime.datetime(2011, 1, 12, 7, 53, tzinfo=<UTC>)
# you end up with an offset
Run Code Online (Sandbox Code Playgroud)

https://zh.wikipedia.org/wiki/Local_mean_time


Ger*_*ard 5

似乎非常有效:

import datetime
day, month, year = '01/12/2011'.split('/')
datetime.datetime(int(year), int(month), int(day)).timestamp()
Run Code Online (Sandbox Code Playgroud)

每个循环 1.61 µs ± 120 ns(7 次运行的平均值 ± 标准偏差,每次 100000 次循环)

  • @Joooeey:[在 Python 3.3 或更高版本上确实如此](https://docs.python.org/3/library/datetime.html#datetime.datetime.timestamp)。发布问题时不可用,但自 2012 年 9 月以来可用。 (2认同)

小智 5

你可以转换为iso格式

my_date = '2020/08/08'
my_date = my_date.replace('/','-') # just to adapte to your question
date_timestamp = datetime.datetime.fromisoformat(my_date).timestamp()
Run Code Online (Sandbox Code Playgroud)