簡體   English   中英

Pandas 使用時區感知索引將行插入 dataframe

[英]Pandas insert row into dataframe with timezone-aware index

我有一個具有時區感知索引的 dataframe,當我嘗試在此 dataframe 中插入新行時,它不起作用,而是將索引的類型更改為'object' (即,它不能添加在行中插入當前類型)。

MRE如下:

import pandas as pd

df = pd.DataFrame({"time": ["2021/06/06 12:00:00"], "col1": [2]})
df.index = pd.to_datetime(df['time'])
df = df.drop('time', axis=1)
df.index = df.index.tz_localize('UTC')

# Doesn't work, index is now 'object' as this is considered a string
# row = pd.Series(name='2021/06/05 12:00:00')
# df = df.append(row)


# Also doesn't work, as timezones differ
row = pd.Series(name=pd.Timestamp('2021/06/05 12:00:00'))
df = df.append(row)

print(df.index)

我了解我可以執行以下操作:

tz = df.index[0].tz
row = pd.Series(name=pd.Timestamp('2021/06/05 12:00:00', tz=tz))

但是,我懷疑這是否會在單位不同時起作用,或者甚至可能是我不知道的 pandas Timestamp的其他屬性,因此理想情況下希望將索引的Timestamp配置完全復制到新時間戳我正在插入。

如果有人碰巧知道如何在此 dataframe 中插入新行,同時保持索引類型不變,將不勝感激。

由於DatetimeTZ僅支持單個時區,因此關鍵是確保新的Timestamp始終與您現有的df.index.tz匹配。

插入新Timestamp

  • 如果來自同一時區,請使用tz=df.index.tz
  • 如果它來自不同的時區,請使用astimezone(df.index.tz)

例子

  • 鑒於您的 MRE df

     df # col1 # time # 2021-06-06 12:00:00+00:00 2 df.index.dtype # datetime64[ns, UTC]
  • 如果您知道您的新Timestamp在同一個tz中,只需像您提到的那樣在構造函數中設置它:

     ts1 = pd.Timestamp('2021/06/05 12:00:00', tz=df.index.tz) df.loc[ts1] = 4 # col1 # time # 2021-06-06 12:00:00+00:00 2 # 2021-06-05 12:00:00+00:00 4 df.index.dtype # datetime64[ns, UTC]
  • 如果您的新Timestamp在不同的tz中(這是您主要關心的問題),請使用astimezone將其轉換(例如,從美國東部回到 UTC):

     ts2 = pd.Timestamp('2021/06/05 12:00:00', tz='US/Eastern').astimezone(df.index.tz) df.loc[ts2] = 6 # col1 # time # 2021-06-06 12:00:00+00:00 2 # 2021-06-05 12:00:00+00:00 4 # 2021-06-05 16:00:00+00:00 6 df.index.dtype # datetime64[ns, UTC]
  • 請注意,我使用loc是因為它更快更簡單,但append仍然有效:

     ts3 = pd.Timestamp('2021/06/05 12:00:00', tz='US/Central').astimezone(df.index.tz) row = pd.Series([8], name=ts3, index=['col1']) df = df.append(row) # col1 # time # 2021-06-06 12:00:00+00:00 2 # 2021-06-05 12:00:00+00:00 4 # 2021-06-05 16:00:00+00:00 6 # 2021-06-05 17:00:00+00:00 8 df.index.dtype # datetime64[ns, UTC]

Timestamp對象當然屬於'object'類型,如果使用Timestamp作為索引,則可能無法轉義索引以采用此類型。

通過“時間戳配置”,我理解“時區”,並且您想在同一時區插入新時間。

  • 要么您從一開始就知道時區,並且所有行的數據都來自已知來自同一時區的來源。 在這種情況下,您可以在實例化Timestamp時指定相同的時區。

  • 或者您首先不知道數據的時區,並且您有來自另一個來源的新數據,因此可能來自不同的時區,您當然知道。 混合來自不同時區的時間戳不是問題,因為在相互比較時應該考慮時區。 您仍然可以稍后將它們全部本地化到您喜歡的時區。

你也可以做這樣的事情。 DateTimeIndexes是對象。

for time_zone in ['MST', 'EST', 'GMT']:
        row = pd.Timestamp('2021/06/05 12:00:00', tz=time_zone)
        df.loc[row] = 1

# to whichever timezone you want
df.index = pd.to_datetime(df.index, utc=True).tz_convert('EST')

暫無
暫無

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

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