根据当前(现在)分钟访问 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
我必须马上匹配。我尝试使用 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 -幼稚的。有什么解决办法吗?
非常感谢!!
差异的原因似乎很简单。
当使用 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
我有一个每分钟一行的 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
我必须马上匹配。我尝试使用 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 -幼稚的。有什么解决办法吗?
非常感谢!!
差异的原因似乎很简单。
当使用 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