请注意,这与此问题完全相同。这个问题假设您想要的时间是"现在",这与任意时间点不同。
我有一个UTC,Aware,DateTime对象,称其为point_in_time
(例如datetime(2017, 3, 12, 16, tzinfo=tz.tzutc())
)。
我有一个时区,称其为 location
(例如 'US/Pacific'
),因为我在乎 ,但它与UTC的小时相抵消可能会随着日光储蓄和Whatnot的全年而变化。p>我想
1)如果我站在location
,
获取point_in_time
的日期2)如果我站在location
。
===
我尝试简单地使用.astimezone(timezone('US/Pacific'))
,然后使用.replace(hours=0, ...)
移至午夜,但是您可能会注意到有关我的示例point_in_time
,该日期的午夜在日光节省的另一侧!
结果是我有时间代表UTC datetime(2017, 3, 12, 7)
,而不是代表UTC datetime(2017, 3, 12, 8)
的时间,这是真正的午夜。
编辑:
我实际上在想我和链接的问题之间的区别是我正在寻找过去的最新午夜。这个问题的答案似乎可以给出一个可能在过去或将来的午夜?
您的示例突出了在本地时区进行DateTime算术的危险。
您可能可以使用PYTZ的normalize()
函数来实现此目标,但这是我发生的方法:
point_in_time = datetime(2017, 3, 12, 16, tzinfo=pytz.utc)
pacific = pytz.timezone("US/Pacific")
pacific_time = point_in_time.astimezone(pacific)
pacific_midnight_naive = pacific_time.replace(hour=0, tzinfo=None)
pacific_midnight_aware = pacific.localize(pacific_midnight_naive)
pacific_midnight_aware.astimezone(pytz.utc) # datetime(2017, 3, 12, 8)
换句话说,您首先转换为太平洋时间以找出正确的日期;然后,您从该日午夜再次转换以获得正确的当地时间。
名为 "US/Pacific"
之类的时区是夏令时的意识。如果您希望使用GMT使用固定的非日光避免偏移的偏移量,则可以使用TimeZones "Etc/GMT+*"
,其中 *是所需的偏移。例如,对于我们太平洋标准时间,您将使用"Etc/GMT+8"
:
import pandas as pd
point_in_time = pd.to_datetime('2017-03-12 16:00:00').tz_localize('UTC')
# not what you want
local_time = point_in_time.tz_convert("US/Pacific")
(local_time - pd.Timedelta(hours=local_time.hour)).tz_convert('UTC')
# Timestamp('2017-03-12 07:00:00+0000', tz='UTC')
# what you want
local_time = point_in_time.tz_convert("Etc/GMT+8")
(local_time - pd.Timedelta(hours=local_time.hour)).tz_convert('UTC')
# Timestamp('2017-03-12 08:00:00+0000', tz='UTC')
有关更多信息
edit 现在我考虑了这一点,午夜PST将始终是上午8点,因此您可以将其简化为
if point_in_time.hour >=8:
local_midnight = point_in_time - point_in_time.hour + 8
else:
local_midnight = point_in_time - point_in_time.hour - 16