簡體   English   中英

如何讓熊貓的 timedeltas 時區感知?

[英]How to make pandas' timedeltas timezone aware?

如果我做

import pandas as pd
pd.to_datetime("2020-03-08") + pd.to_timedelta('1D')

我得到Timestamp('2020-03-09 00:00:00')的預期。

但是當我嘗試使用時區感知數據類型時..

pd.to_datetime("2020-03-08").tz_localize('America/New_York') + pd.to_timedelta('1D')

我得到Timestamp('2020-03-09 01:00:00-0400', tz='America/New_York') ,它是午夜后一小時。

當您意識到 2020-03-08 是夏令時時鍾向前移動的那一天,而這一天只有 23 小時時,這實際上是有道理的。 但是我有一個用例,我想要一個時間增量,它始終是一個“本地時間”一天。

那么有沒有辦法創建一個“本地時間感知”時間增量 object 以便“1D”代表一個日歷日,無論一天是 23、24 還是 25 小時長?

您可以做的是比較時間戳的.dst()屬性,如果 DST 轉換介於兩者之間,則調整 1 小時。 您還必須發現添加 timedelta 會導致生成的時間戳恰好落在時區不存在的小時上的情況。

import pandas as pd
import pytz

def account_for_dst(t0, t1):
    """
    adjust the timedelta between two timezone-aware timestamps t0 and t1
    for DST transitions.
    """
    # check if time delta would fall exactly on a DST transition:
    dt = t1-t0
    try:
        _ = (t0.tz_localize(None)+dt).tz_localize(t0.tz)
    except pytz.NonExistentTimeError:
        return t0, t1 # t0 and t1 not modified...
    
    # otherwise, adjust the time delta...
    else:
        if t0.dst() > t1.dst():
            t1 += pd.to_timedelta('1H')
        elif t0.dst() < t1.dst():    
            t1 -= pd.to_timedelta('1H')
        return t0, t1

這將給出示例性結果,例如

times = ("2020-3-7 02:00", "2020-3-8 00:00", "2020-11-1 00:00")

for t in times:
    t0 = pd.to_datetime(t).tz_localize('America/New_York')
    t1 = t0 + pd.to_timedelta('1D')
    print(f"before: {str(t0), str(t1)}")
    t0, t1 = account_for_dst(t0, t1)
    print(f"after: {str(t0), str(t1)}\n")   
    
# before: ('2020-03-07 02:00:00-05:00', '2020-03-08 03:00:00-04:00')
# after: ('2020-03-07 02:00:00-05:00', '2020-03-08 03:00:00-04:00')

# before: ('2020-03-08 00:00:00-05:00', '2020-03-09 01:00:00-04:00')
# after: ('2020-03-08 00:00:00-05:00', '2020-03-09 00:00:00-04:00')

# before: ('2020-11-01 00:00:00-04:00', '2020-11-01 23:00:00-05:00')
# after: ('2020-11-01 00:00:00-04:00', '2020-11-02 00:00:00-05:00') 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM