我有一個每分鐘一行的資料框。我需要訪問當前分鐘對應的行
value
2022-01-12 11:27:24 01:00 a
2022-01-12 11:28:41 01:00 b
2022-01-12 11:29:36 01:00 c
2022-01-12 11:30:11 01:00 d
2022-01-12 11:31:03 01:00 e
2022-01-12 11:32:39 01:00 f
我必須馬上匹配。我嘗試使用pandas和datetime(重現它的代碼)找到當前時間:
import pandas as pd
import numpy as np
import string
import datetime
start_idx=(datetime.datetime.now()).strftime(format="%Y-%m-%d %H:%M")
end_idx=(datetime.datetime.now() datetime.timedelta(minutes= 5)).strftime(format="%Y-%m-%d %H:%M")
index_today = pd.date_range(start=start_idx, end=end_idx, freq='1T',tz='Europe/Rome')
# create random seconds
index_today=[i pd.DateOffset(seconds=np.random.randint(0,59)) for i in index_today]
df = pd.DataFrame(index=index_today, data=list(string.ascii_lowercase[0:len(index_today)]),columns=['value'])
now_pandas = pd.to_datetime("now").round(freq='min').tz_localize('utc').tz_convert('Europe/Rome')
now_datetime = datetime.datetime.now().strftime(format="%Y-%m-%d %H:%M")
out_pandas=df.loc[df.index.floor('Min')==now_pandas, :]
out_datetime=df.loc[now_datetime, :]
print('now pandas is ',now_pandas)
print('now datetime is ',now_datetime)
print('Current value found with Pandas:\n',out_pandas)
print('Current value found with datetime\n',out_datetime)
但有時它們會給出不同的結果:
now pandas is 2022-01-12 11:46:00 01:00
now datetime is 2022-01-12 11:45
Current value found with Pandas:
value
2022-01-12 11:46:08 01:00 b
Current value found with datetime
value
2022-01-12 11:45:35 01:00 a
最好和最穩健的方法是什么?
另外,我注意到,如果資料框不支持 tz,則需要投入pd.to_datetime("now")時間utc,我需要對其進行本地化、轉換,然后將其轉回 tz-naive。有什么解決辦法嗎?
非常感謝你!!
uj5u.com熱心網友回復:
如何根據當前分鐘選擇行?確保正確設定條件(按預期),例如將當前時間設定為分鐘(剪輯到分鐘解析度)。前任:
import pandas as pd
import numpy as np
tz = 'Europe/Rome'
now = pd.Timestamp.now(tz)
print(now)
# 2022-01-12 12:11:38.796675 01:00
idx = pd.date_range(now.floor('d'), now.ceil('d'), freq='min')
df = pd.DataFrame(index=idx, data=np.random.randint(0, 5, size=idx.size), columns=['value'])
out_pandas = df.loc[df.index.floor('min') == now.floor('min'), :]
print(out_pandas)
# value
# 2022-01-12 12:11:00 01:00 1
uj5u.com熱心網友回復:
差異的原因似乎很簡單。
使用熊貓時,您將四舍五入到最接近的分鐘,因為它是四舍五入的最接近的值(即:如果在 30 秒之后,則為下一分鐘)。
使用日期時間格式時,您只是洗掉秒數。
您可以通過使用 floor 而不是在 pandas datetime 中舍入或在格式化結果之前將 datetime.now() 舍入到最接近的分鐘來獲得相同的行為。
或者,既然您知道它的來源并堅持使用 pandas 方法(我會做什么),您可能就不再關心差異了。
注意:另一個小的區別是,您實際上是在代碼中的兩個不同時間呼叫 now(),一次用于 pandas,另一個用于 datetime,因此兩者之間已經存在時間差。但這不是主要影響。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/409204.html
標籤:
