我是 Panda 的新手,在 Pandas/時間序列分析和夏令時方面遇到了麻煩。
我有一個包含紐約夏令時資料的 1 分鐘頻率 txt 檔案。
當我使用 pytz 進行本地化并轉換為 UTC,然后下采樣到 2 小時、4 小時時,所有資料和時間都與夏令時期間的行匹配,但在標準時間(11 月中旬至 3 月中旬)期間與這些行不匹配。我需要的是讓一切都匹配。
所以我(相信)我需要的是以某種方式規范化標準時間行。實際上,當下采樣以 2H 為例時,很明顯時間從偶數時間(午夜、凌晨 2 點、凌晨 4 點、早上 6 點等)變為奇數時間(下午 1 點、下午 3 點、下午 5 點等)。如果我可以解決這個問題,那么轉換為 UTC 和/或其他時區并重新采樣(我認為我已經弄清楚了所有這些)應該會起作用。
到目前為止我能得到的最接近的是:
獲取 1 分鐘資料,本地化為美國/東部,轉換為 UTC。當重新采樣為 2 小時時,這匹配(所有偶數小時)但對于屬于標準時間的日期是不正確的。
然后我嘗試:
獲取 1 分鐘資料,本地化為 America/New_York,轉換為 UTC。
這與重新采樣的 2H 中的全年相匹配,并且對于標準時間是正確的,但對于 DST 則不正確。
代碼在下面,您會注意到我已經注釋掉了幾個代碼塊。那是因為我嘗試了很多不同的組合來嘗試自己解決這個問題。
我應該使用 pytz 以外的東西嗎?或者?謝謝您的幫助!
import pandas as pd
import datetime as datetime
import pytz as pytz
from pytz import all_timezones
colnames=['Date', 'Open', 'High', 'Low','Close','Volume']
df = pd.read_csv ("/Users/aiki/Desktop/GC_1min_full.txt", sep=',',names=colnames, header=None,index_col='Date',parse_dates=True)
#Make this naive NY data TZ aware: America/New_York handles DST, US/Eastern does not.
df = df.tz_localize('America/New_York')
#Convert the NY TZ aware data to UTC
df = df.tz_convert(tz= 'UTC')
#Make this naive NY data TZ aware
#df = df.tz_localize('US/Eastern')
#Make this UTC NY localized (again)
#df = df.tz_convert('US/Eastern')
#Convert this data to central time
#df = df.tz_convert(tz= 'America/Chicago')`
在其他海報的指導后在此處添加更多資訊:
我的資料源說:“所有資料都在美國東部時區(即 EST/EDT,具體取決于一年中的時間)”。
如果我讀入原始資料,df.index 會顯示“日期時間”,但沒有 TZ 資訊,只是為了檢查,我:列印 (df.index.tz) 并得到“無”。這意味著我有他們所說的 DST/ST 格式的原始 TZ 資料。
自從我最初的帖子以來,我了解到:
1 - EST 是 UTC -5 小時。這是 pytz(美國/東部)。
2 - 但 pytz(美國/紐約)本質上是冬季的 EST 和夏季的 EDT。因此,重要的是,America/New_York 處理 DST。
(我相信這是對的,如有錯誤請指正)
經過(多次)更多嘗試后,我現在知道的是:
EST 轉換 - 本地化為美國/紐約,轉換為 UTC,進行重采樣,轉換為美國/芝加哥。
將驗證材料設定為 Chicago tz 時,這適用于 EST,但不適用于 DST。
#Make this naive NY data TZ aware using America/New_York which handles DST.
df = df.tz_localize(tz= 'America/New_York')
df = df.tz_convert(tz= 'UTC')
(do resample code, etc)
df = df.tz_convert(tz= 'America/Chicago')
DST 將 本地化轉換為美國/東部,轉換為美國/中部,重新取樣。
將驗證材料設定為 Chicago tz 時,這適用于 DST 但不適用于 EST。
df = df.tz_localize('US/Eastern')
df = df.tz_convert(tz= 'US/Central')
(do resample code, etc)
這并不能解決如何一次獲得一整年的問題,但我可以接受一個分為兩部分的解決方案,如果必須的話,它會丟失一些資料。不理想,但時間有限...
謝謝大家的好主意——我非常感激。如果您有任何其他想法,我會洗耳恭聽。
解決以下 Ultra909 的評論:
1- 是的,按照我上面的方法完成,我重新采樣的 DST 和我的(單獨的)EST 資料匹配我的圖表平臺,也匹配另一個面向公眾的圖表系統。
2- 資料是 1 分鐘資料,由于它與市場相關,因此在實際(缺失/模糊時間)0200 DST/EST 切換期間沒有資料(或時間戳)。所以對我來說,很難說它是如何處理的。
2021 年夏令時從星期日 3.14.21 @0200 開始。2021-03-12 是紐約州星期五 2021-03-14 是紐約州星期日
這個來自資料:
2021-03-12 16:59:00,65.57,65.60,65.55,65.56,28
#(Market reopens Sunday @1800, so we have timestamps.
2021-03-14 18:00:00,65.56,65.75,65.54,65.68,238
#(So...the actual DST change is not visible here...)
2021 年夏令時結束于星期日 2021-11-07 2021-11-05 是紐約州星期五 2021-11-07 是紐約州星期日
2021-11-05 16:59:00,81.15,81.22,81.13,81.17,96
2021-11-07 18:00:00,81.13,81.65,81.05,81.60,974
可能是我(很有可能)。或者它可能是資料。不管怎樣,我想我已經盡我所能了。如果有人知道這不是問題的資料提供者,我將不勝感激。
另外,如果我繼續這條路,我將需要把每年的 12 月 1 日至 2 月 28 日分開。我將失去涉及 DST/EST 轉換的 2 個月,但它必須這樣做。因此,如果有人對如何在 Pandas 中以編程方式集體執行此操作有想法,那就太好了。
再次感謝您的所有投入!
uj5u.com熱心網友回復:
所以如果我理解正確的話,資料是在東部標準時間(GMT-5)沒有任何夏令時?
那么我要解決的方法是將 5:00:00 全面添加到索引中,然后本地化為 UTC。
ix = df.index pd.Timedelta(hours=5)
df_utc = df.set_index(ix).tz_localize("UTC")
如果需要,您可以tz_convert(..)進一步。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/534944.html
下一篇:建構式什么時候被子類繼承
