根据当前(现在)分钟访问 Pandas 数据框

Access Pandas Dataframe based on current (now) minute

我有一个每分钟一行的 Dataframe。我需要访问与当前分钟对应的行

                          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

我必须马上匹配。我尝试使用 pandasdatetime(重现它的代码)找到当前时间:

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 -幼稚的。有什么解决办法吗?

非常感谢!!

差异的原因似乎很简单。

当使用 pandas 时,您将四舍五入到最近的分钟,因为它是四舍五入,它会转到最接近的值(即:如果它在第 30 秒之后,则下一分钟)。

使用日期时间格式时,您只是删除了秒数。

您可以通过在 pandas 日期时间中使用 floor 而不是 round 或者在格式化结果之前将 datetime.now() 舍入到最接近的分钟来获得相同的行为。

或者您可能不再关心这些差异,因为您知道它的来源并坚持使用 pandas 方法(我会做的)。

注意:另一个小区别是您实际上在代码中的两个不同时间调用 now() 一次 pandas 另一个用于日期时间,因此两者之间已经存在时间差。但这不是主要影响。

如何根据当前分钟 select 行?确保正确设置条件(按预期),例如通过将当前时间降低到分钟(剪辑到分钟分辨率)。例如:

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