Bir python datetime nesnesini kısaltmanın şık bir yolu nedir?
Bu özel durumda, güne. Temel olarak saat, dakika, saniye ve mikrosaniyeyi 0'a ayarlayın.
Ben de çıktı bir dize değil bir datetime nesnesi olmasını istiyorum.
Bir python datetime nesnesini kısaltmanın şık bir yolu nedir?
Bu özel durumda, güne. Temel olarak saat, dakika, saniye ve mikrosaniyeyi 0'a ayarlayın.
Ben de çıktı bir dize değil bir datetime nesnesi olmasını istiyorum.
Yanıtlar:
Bence bu aradığınız şey ...
>>> import datetime
>>> dt = datetime.datetime.now()
>>> dt = dt.replace(hour=0, minute=0, second=0, microsecond=0) # Returns a copy
>>> dt
datetime.datetime(2011, 3, 29, 0, 0)
Ama şeylerin zaman yönünü gerçekten umursamıyorsanız, gerçekten sadece datenesnelerin etrafından geçiyor olmalısınız ...
>>> d_truncated = datetime.date(dt.year, dt.month, dt.day)
>>> d_truncated
datetime.date(2011, 3, 29)
replace()yöntemin bir datetime nesnesi döndürdüğünü belirterek , doğru büyütme şöyle olur:dt = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
datetime, datenesne değil ( dt.date()çağrı kullanarak alabileceğinizi (açık kurucuyu kullanmanıza gerek yok) istiyor ). .replace()Eğer yöntem başarısız olabilir datetimenanosaniye destek ekler . Bunun yerine kullanabilirsinizdatetime.combine() .
datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)?
Eğer zaman umursamıyorum bir datedeğil kullanın datetime.
>>> now = datetime.now()
>>> now.date()
datetime.date(2011, 3, 29)
Aşağıdaki gibi bir tarih saatini güncelleyebilirsiniz:
>>> now.replace(minute=0, hour=0, second=0, microsecond=0)
datetime.datetime(2011, 3, 29, 0, 0)
replaceDört yıl önce kabul edilen cevabın işe yaradığını biliyorum, ancak bu kullanmaktan biraz daha hafif görünüyor replace:
dt = datetime.date.today()
dt = datetime.datetime(dt.year, dt.month, dt.day)
notlar
datetimeYapıcıya zaman özelliklerini iletmeden nesne , gece yarısı alırsınız.dt = datetime.datetime.now()Değişmez olduğu için datetime nesnesini kesemezsiniz .
Bununla birlikte, orijinal tarihi veya tzinfo'yu atmadan, 0 saat, dakika, saniye ve mikrosaniye alanlarıyla yeni bir datetime oluşturmanın bir yolu:
newdatetime = now.replace(hour=0, minute=0, second=0, microsecond=0)
replaceseçeneği önce koyarsanız, muhtemelen istedikleri şey budur.
tzinfo=now.tzinfo. tzinfoGece yarısı farklı örneğin olabilir, utc de ofset 2012-04-01 00:09:00Avustralya / Melbourne saat diliminde (9 am) 'dir AEST+10:00ama o AEDT+11:00at 2012-04-01 00:00:00(gece yarısı) - O gün sonu DST geçiş yoktur. pytzDüzeltmek için modülü kullanabilirsiniz , cevabımı görün.
Belirli bir datetime nesnesine karşılık gelen bir gece yarısı almak için datetime.combine()yöntemi kullanabilirsiniz :
>>> from datetime import datetime, time
>>> dt = datetime.utcnow()
>>> dt.date()
datetime.date(2015, 2, 3)
>>> datetime.combine(dt, time.min)
datetime.datetime(2015, 2, 3, 0, 0)
Kıyasla avantajı yöntemi olmasıdır tabanlı bir çözümdür çalışmaya devam edecektir bile modül tanıtır nanosaniye desteği.replace()datetime.combine()datetime .
tzinfogerekiyorsa korunabilir ancak utc ofseti gece yarısı farklı olabilir, örneğin bir DST geçişinden dolayı ve bu nedenle saf bir çözelti (ayar tzinfosüresi özelliği) başarısız olabilir. Bkz. Belirli bir saat dilimi için “gece yarısı” UTC saatini nasıl alırım?
Bunun için pandalar kullanabilirsiniz (bu görev için ek yük olmasına rağmen). Sen kullanabilirsiniz yuvarlak , zemin ve hücrelerinin, normal numaraları ve herhangi pandalar frekansı için gibi offset-takma adları :
import pandas as pd
import datetime as dt
now = dt.datetime.now()
pd_now = pd.Timestamp(now)
freq = '1d'
pd_round = pd_now.round(freq)
dt_round = pd_round.to_pydatetime()
print(now)
print(dt_round)
"""
2018-06-15 09:33:44.102292
2018-06-15 00:00:00
"""
Gün, ay, yıl ayıklamak için datetime.strftime komutunu kullanabilirsiniz ...
Misal :
from datetime import datetime
d = datetime.today()
# Retrieves the day and the year
print d.strftime("%d-%Y")
Çıktı (bugün için):
29-2011
Yalnızca günü almak istiyorsanız, aşağıdaki gün özniteliğini kullanabilirsiniz:
from datetime import datetime
d = datetime.today()
# Retrieves the day
print d.day
Çıkış (bugün için):
29
d.dayvb.
Tarihleri değiştirmek için kullanılan harika bir kütüphane var: Delorean
import datetime
from delorean import Delorean
now = datetime.datetime.now()
d = Delorean(now, timezone='US/Pacific')
>>> now
datetime.datetime(2015, 3, 26, 19, 46, 40, 525703)
>>> d.truncate('second')
Delorean(datetime=2015-03-26 19:46:40-07:00, timezone='US/Pacific')
>>> d.truncate('minute')
Delorean(datetime=2015-03-26 19:46:00-07:00, timezone='US/Pacific')
>>> d.truncate('hour')
Delorean(datetime=2015-03-26 19:00:00-07:00, timezone='US/Pacific')
>>> d.truncate('day')
Delorean(datetime=2015-03-26 00:00:00-07:00, timezone='US/Pacific')
>>> d.truncate('month')
Delorean(datetime=2015-03-01 00:00:00-07:00, timezone='US/Pacific')
>>> d.truncate('year')
Delorean(datetime=2015-01-01 00:00:00-07:00, timezone='US/Pacific')
ve datetime değerini geri almak istiyorsanız:
>>> d.truncate('year').datetime
datetime.datetime(2015, 1, 1, 0, 0, tzinfo=<DstTzInfo 'US/Pacific' PDT-1 day, 17:00:00 DST>)
Https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.dt.floor.html adresinde daha fazla bilgi bulabilirsiniz.
Şimdi 2019, sanırım bunu yapmanın en etkili yolu:
df['truncate_date'] = df['timestamp'].dt.floor('d')
6 yıl sonra ... Bu yazıyı buldum ve numpy yaklaşımını daha çok sevdim:
import numpy as np
dates_array = np.array(['2013-01-01', '2013-01-15', '2013-01-30']).astype('datetime64[ns]')
truncated_dates = dates_array.astype('datetime64[D]')
şerefe
Sadece kullanabilirsiniz
datetime.date.today()
Hafiftir ve tam olarak istediğinizi döndürür.
Truncate ne anlama geliyor?
Strftime () yöntemini ve uygun bir biçim dizesi kullanarak biçimlendirme üzerinde tam denetime sahip olursunuz.
http://docs.python.org/library/datetime.html#strftime-strptime-behavior
DateTime türü bir dizi ile uğraşıyorsanız, özellikle Series nesnesinin çok sayıda satırı olduğunda bunları kısaltmanın daha etkili bir yolu vardır.
Kullanabilirsiniz Zemin fonksiyonunu
Örneğin, saatlere kısaltmak istiyorsanız:
Bir dizi tarih oluşturun
times = pd.Series(pd.date_range(start='1/1/2018 04:00:00', end='1/1/2018 22:00:00', freq='s'))
Değiştirme ve zemin fonksiyonları arasındaki çalışma süresini karşılaştırarak kontrol edebiliriz.
%timeit times.apply(lambda x : x.replace(minute=0, second=0, microsecond=0))
>>> 341 ms ± 18.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit times.dt.floor('h')
>>>>2.26 ms ± 451 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
İşte bir hatta uyan ama özellikle zarif olmayan başka bir yol:
dt = datetime.datetime.fromordinal(datetime.date.today().toordinal())