亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將可識別熊貓時區的DateTimeIndex轉換為樸素的時間戳,但在特定時區

將可識別熊貓時區的DateTimeIndex轉換為樸素的時間戳,但在特定時區

慕慕森 2019-10-10 17:00:33
您可以使用該函數tz_localize來識別Timestamp或DateTimeIndex時區,但如何相反:如何在保留時區的情況下將時區識別的Timestamp轉換為樸素的時間戳?一個例子:In [82]: t = pd.date_range(start="2013-05-18 12:00:00", periods=10, freq='s', tz="Europe/Brussels")In [83]: tOut[83]: <class 'pandas.tseries.index.DatetimeIndex'>[2013-05-18 12:00:00, ..., 2013-05-18 12:00:09]Length: 10, Freq: S, Timezone: Europe/Brussels我可以通過將其設置為None來刪除時區,但是結果將轉換為UTC(12點變成10):In [86]: t.tz = NoneIn [87]: tOut[87]: <class 'pandas.tseries.index.DatetimeIndex'>[2013-05-18 10:00:00, ..., 2013-05-18 10:00:09]Length: 10, Freq: S, Timezone: None還有另一種方法可以將DateTimeIndex轉換為樸素的時區,但同時保留設置時區的時區嗎?關于我問這個原因的一些背景信息:我想使用時區樸素的時間序列(以避免時區的額外麻煩,在我正在研究的情況下不需要它們)。但是由于某些原因,我必須處理本地時區(歐洲/布魯塞爾)中的時區感知時間序列。由于我所有其他數據都是時區純樸的(但以我的本地時區表示),因此我想將此時間序列轉換為樸素才能進一步使用,但它也必須以我的本地時區表示(因此,只需刪除時區信息,而不將用戶可見的時間轉換為UTC)。我知道時間實際上是內部存儲為UTC,并且僅在您表示它時才轉換為另一個時區,所以當我要“非本地化”時間時,必須進行某種轉換。例如,使用python datetime模塊,您可以像這樣“刪除”時區:In [119]: d = pd.Timestamp("2013-05-18 12:00:00", tz="Europe/Brussels")In [120]: dOut[120]: <Timestamp: 2013-05-18 12:00:00+0200 CEST, tz=Europe/Brussels>In [121]: d.replace(tzinfo=None)Out[121]: <Timestamp: 2013-05-18 12:00:00> 因此,基于此,我可以執行以下操作,但是我想當使用較大的時間序列時,這將不是很有效:In [124]: tOut[124]: <class 'pandas.tseries.index.DatetimeIndex'>[2013-05-18 12:00:00, ..., 2013-05-18 12:00:09]Length: 10, Freq: S, Timezone: Europe/BrusselsIn [125]: pd.DatetimeIndex([i.replace(tzinfo=None) for i in t])Out[125]: <class 'pandas.tseries.index.DatetimeIndex'>[2013-05-18 12:00:00, ..., 2013-05-18 12:00:09]Length: 10, Freq: None, Timezone: None
查看完整描述

3 回答

?
慕村225694

TA貢獻1880條經驗 獲得超4個贊

我認為您無法以比擬議的方式更有效的方式實現所需的目標。


潛在的問題是時間戳(如您所知)由兩部分組成。表示UTC時間和時區tz_info的數據。當在屏幕上打印時區時,時區信息僅用于顯示目的。在顯示時,數據會適當偏移,并將+01:00(或類似值)添加到字符串中。剝離tz_info值(使用tz_convert(tz = None))實際上并不會改變表示時間戳幼稚部分的數據。


因此,執行所需操作的唯一方法是修改基礎數據(熊貓不允許這樣做……DatetimeIndex是不可變的–請參見DatetimeIndex的幫助),或創建一組新的時間戳對象并包裝它們在新的DatetimeIndex中。您的解決方案將執行以下操作:


pd.DatetimeIndex([i.replace(tzinfo=None) for i in t])

作為參考,以下是replace方法Timestamp(請參閱tslib.pyx):


def replace(self, **kwds):

    return Timestamp(datetime.replace(self, **kwds),

                     offset=self.offset)

您可以參考文檔上的內容datetime.datetime,它datetime.datetime.replace還會創建一個新對象。


如果可以的話,提高效率的最佳選擇是修改數據源,以使它(錯誤地)報告沒有時區的時間戳。您提到:


我想使用時區樸素的時間序列(以避免額外的時區麻煩,在我正在處理的情況下,我不需要它們)


我很好奇您指的是什么額外的麻煩。作為所有軟件開發的一般規則,我建議您將時間戳記“天真值”保持在UTC中。沒有什么比查看兩個不同的int64值(它們屬于哪個時區)更糟糕的了。如果您始終始終使用UTC作為內部存儲,那么將避免無數的麻煩。我的口頭禪是時區僅是人類的I / O。


查看完整回答
反對 回復 2019-10-10
  • 3 回答
  • 0 關注
  • 612 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號