Biçimdeki bir dizeyi "%d/%m/%Y"zaman damgasına nasıl dönüştürebilirim ?
"01/12/2011" -> 1322697600
Biçimdeki bir dizeyi "%d/%m/%Y"zaman damgasına nasıl dönüştürebilirim ?
"01/12/2011" -> 1322697600
Yanıtlar:
>>> import time
>>> import datetime
>>> s = "01/12/2011"
>>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple())
1322697600.0
calendar.timegm()veya.toordinal()
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()biraz daha kısa
.timestamp()varsayar . Yanıttaki kod yalnızca yerel saat diliminin sıfır utc ofsetine sahip olduğu bir bilgisayarda çalışır (beklenen üretimler ). 1322697600
Ben ciso8601datetime'ın çalma süresinden 62 kat daha hızlı kullanıyorum .
t = "01/12/2011"
ts = ciso8601.parse_datetime(t)
# to get time in seconds:
time.mktime(ts.timetuple())
Burada daha fazla bilgi edinebilirsiniz .
Dizeyi bir tarih nesnesine dönüştürmek için:
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()
Tarih nesnesini POSIX zaman damgasına dönüştürmenin yolu saat dilimine bağlıdır. Gönderen dönüştürme datetime.datePython UTC zaman damgasına :
date nesnesi UTC'de gece yarısını temsil eder
import calendar
timestamp1 = calendar.timegm(utc_date.timetuple())
timestamp2 = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * 24*60*60
assert timestamp1 == timestamp2
date nesnesi yerel saatte gece yarısını temsil eder
import time
timestamp3 = time.mktime(local_date.timetuple())
assert timestamp3 != timestamp1 or (time.gmtime() == time.localtime())
UTC'de gece yarısı ve yerel saat aynı saat örneği olmadığı sürece zaman damgaları farklıdır.
NameError: name 'wckCalendar' is not defined. Windows 32 bit makinede Python 3.4.1 kullanıyorum. Herhangi bir fikir? Teşekkürler.
>>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s"))
1322683200
"%s"Python tarafından desteklenmiyor . Taşınabilir değildir.
Cevap, giriş tarihi saat diliminize de bağlıdır. Tarih yerel bir tarih ise, o zaman katrielalex dedi gibi mktime () kullanabilirsiniz - sadece neden bu kısa sürüm yerine datetime kullandığını görmüyorum:
>>> time.mktime(time.strptime('01/12/2011', "%d/%m/%Y"))
1322694000.0
Ama muhtemelen farklı bir TZ'de olduğum için sonucumun kendisinden farklı olduğunu gözlemleyin (ve sonuç saat dilimi içermeyen UNIX zaman damgasıdır)
Şimdi giriş tarihi zaten UTC ise, doğru çözüm olduğuna inanıyorum daha:
>>> calendar.timegm(time.strptime('01/12/2011', '%d/%m/%Y'))
1322697600
Basitçe kullanın datetime.datetime.strptime:
import datetime
stime = "01/12/2011"
print(datetime.datetime.strptime(stime, "%d/%m/%Y").timestamp())
Sonuç:
1322697600
Yerel saat dilimi yerine UTC kullanmak için .replace:
datetime.datetime.strptime(stime, "%d/%m/%Y").replace(tzinfo=datetime.timezone.utc).timestamp()
floatdeğilint
Bu cevapların birçoğu, tarihin başlamak için naif olduğunu düşünmekle uğraşmıyor
Doğru olmak için, önce naif tarihi bir saat diliminde bilinçli hale getirmeniz gerekir
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
Ayrıca:
Kullanarak dikkatli olun pytziçin tzinfobir de datetime.datetimepek çok saat dilimlerinde için YAPAR DEĞİL İŞ. Pytz saat dilimi ile tarih saatine bakın . Tzinfo'nun nasıl ayarlandığına bağlı olarak farklı ofset
# 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
Dateutil öneririm :
import dateutil.parser
dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp()
"%d/%m/%Y"biçiminde bekliyor . Karşılaştırma: dateutil.parser.parse("01/02/2001")vedatetime.strptime("01/02/2001", "%d/%m/%Y")
1322697600yerel saat diliminiz UTC olmadığı sürece beklenen değeri üretmez . Bkz 2014 yorumumu
Oldukça verimli görünüyor:
import datetime
day, month, year = '01/12/2011'.split('/')
datetime.datetime(int(year), int(month), int(day)).timestamp()
1.61 µs ± 120 ns döngü başına (ortalama ± std. 7 çalıştırma, her biri 100000 döngü)
datetimeişlevi? datetimedan datetimekütüphane desteklemiyor.timestamp()
datetime.timestamp (datetime instanse) kullanın, datetime örneği saat dilimi bilgilerini içerir, bu nedenle zaman damgası standart bir utc zaman damgası olur. datetime değerini zaman-dizisine dönüştürürseniz, saat dilimini kaybeder, dolayısıyla sonuç hata olur. bir arayüz sağlamak istiyorsanız, şöyle yazmalısınız: int (datetime.timestamp (time_instance)) * 1000
Tarihi, saat dilimi ile birlikte herhangi bir formattan dönüştürmek için strptimeişlevini kullanmak için aşağıdaki bağlantıya başvurabilirsiniz datetime.datetime.
https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior
isoformat'a dönüştürebilirsiniz
my_date = '2020/08/08'
my_date = my_date.replace('/','-') # just to adapte to your question
date_timestamp = datetime.datetime.fromisoformat(my_date).timestamp()
UNIX Epoch zamanını almak için basit bir işlev.
NOT : Bu işlev, giriş tarihi saatinin UTC biçiminde olduğunu varsayar ( Buradaki yorumlara bakın ).
def utctimestamp(ts: str, DATETIME_FORMAT: str = "%d/%m/%Y"):
import datetime, calendar
ts = datetime.datetime.utcnow() if ts is None else datetime.datetime.strptime(ts, DATETIME_FORMAT)
return calendar.timegm(ts.utctimetuple())
Kullanımı :
>>> utctimestamp("01/12/2011")
1322697600
>>> utctimestamp("2011-12-01", "%Y-%m-%d")
1322697600