Convert string date to timestamp in Python
如何将格式为
1 | "01/12/2011" -> 1322697600 |
1 2 3 4 5 | >>> import time >>> import datetime >>> s ="01/12/2011" >>> time.mktime(datetime.datetime.strptime(s,"%d/%m/%Y").timetuple()) 1322697600.0 |
要将字符串转换为日期对象:
1 2 3 4 5 | 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() |
将日期对象转换为POSIX时间戳的方法取决于时区。从Python中的
-
date对象表示UTC的午夜
1
2
3
4
5import calendar
timestamp1 = calendar.timegm(utc_date.timetuple())
timestamp2 = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * 24*60*60
assert timestamp1 == timestamp2 -
date对象表示当地时间的午夜
1
2
3
4import time
timestamp3 = time.mktime(local_date.timetuple())
assert timestamp3 != timestamp1 or (time.gmtime() == time.localtime())
除非UTC中的午夜和本地时间是同一时间实例,否则时间戳是不同的。
我使用
1 2 3 4 | t ="01/12/2011" ts = ciso8601.parse_datetime(t) # to get time in seconds: time.mktime(ts.timetuple()) |
你可以在这里了解更多。
1 2 | >>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s")) 1322683200 |
答案还取决于您输入的日期时区。如果你的日期是本地日期,那么你可以使用像katrielalex所说的mktime() - 只是我不明白为什么他使用datetime而不是这个更短的版本:
1 2 | >>> time.mktime(time.strptime('01/12/2011',"%d/%m/%Y")) 1322694000.0 |
但请注意我的结果与他不同,因为我可能在不同的TZ中(结果是无时区的UNIX时间戳)
现在,如果输入日期已经是UTC,那么我认为正确的解决方案是:
1 2 | >>> calendar.timegm(time.strptime('01/12/2011', '%d/%m/%Y')) 1322697600 |
只需使用
1 2 3 | import datetime stime ="01/12/2011" print(datetime.datetime.strptime(stime,"%d/%m/%Y").timestamp()) |
结果:
1 | 1322697600 |
要使用UTC而不是本地时区,请使用
1 | datetime.datetime.strptime(stime,"%d/%m/%Y").replace(tzinfo=datetime.timezone.utc).timestamp() |
我建议dateutil:
1 2 | import dateutil.parser dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp() |
首先,您必须使用strptime类将字符串转换为struct_time格式。
然后从那里使用mktime来获得你的浮动。
很多这些答案都没有考虑到开始时的日期是天真的
要正确,您需要先将天真日期设为时区感知日期时间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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 |
也:
小心,在
1 2 3 4 5 6 7 8 9 10 | # 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 |
https://en.wikipedia.org/wiki/Local_mean_time
您可以参考以下链接,使用
https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior
似乎非常有效:
1 2 3 | import datetime day, month, year = '01/12/2011'.split('/') datetime.datetime(int(year), int(month), int(day)).timestamp() |
每回路1.61μs±120 ns(平均值±标准偏差,每次运行10次,每次100000次循环)
只使用datetime.timestamp(你的datetime instanse),datetime实例包含时区信息,所以时间戳将是标准的utc时间戳。如果你将datetime转换为timetuple,它将失去它的时区,因此结果将是错误的。
如果你想提供一个接口,你应该这样写:
int(datetime.timestamp(time_instance))* 1000