我有一個帶有“queue_ist_dt”列的資料框。此列包含 pandas._libs.tslibs.timestamps.Timestamp 值。我的要求是:
如果時間 = 10:13:00 那么 round_off_time = 10:00:00 如果時間 = 23:29:00 那么 round_off_time = 23:00:00
等等。
如果時間 = 10:31:00 那么 round_off_time = 10:30:00 如果時間 = 23:53:00 那么 round_off_time = 23:30:00
等等。
如果時間 = 10:30:00 那么 round_off_time = 10:30:00
這是3個條件。
我嘗試撰寫以下邏輯:
for r in range(df.shape[0]):
try:
if df.loc[r,'queue_ist_dt'].minute<30:
timedelta = pd.Timedelta(minutes=df.loc[r,'queue_ist_dt'].minute)
df.loc[r,'queue_placed_interval'] = df.loc[r,'queue_ist_dt']- timedelta
elif df.loc[r,'queue_ist_dt'].minute>30:
******NEED HELP TO BUILD THIS LOGIC******
except:
pass
需要幫助為分鐘大于 30 分鐘并且必須向下舍入到 30 分鐘的時間建立邏輯。
uj5u.com熱心網友回復:
使用Series.dt.floor
:
#if necessary convert to datetimes or timedeltas
#df['queue_ist_dt'] = pd.to_datetime(df['queue_ist_dt'])
df['queue_ist_dt'] = pd.to_timedelta(df['queue_ist_dt'])
df['queue_ist_dt1'] = df['queue_ist_dt'].dt.floor('30Min')
print (df)
queue_ist_dt queue_ist_dt1
0 0 days 10:13:00 0 days 10:00:00
1 0 days 23:29:00 0 days 23:00:00
2 0 days 10:31:00 0 days 10:30:00
3 0 days 23:53:00 0 days 23:30:00
4 0 days 10:30:00 0 days 10:30:00
uj5u.com熱心網友回復:
以這個資料框df
為例
df = pd.DataFrame({'queue_ist_dt': [pd.Timestamp('2021-01-01 10:00:00'),
pd.Timestamp('2021-01-01 10:30:00'),
pd.Timestamp('2021-01-01 11:00:00'),
pd.Timestamp('2021-01-01 11:30:00'),
pd.Timestamp('2021-01-01 23:00:00'),
pd.Timestamp('2021-01-01 23:30:00'),
pd.Timestamp('2021-01-01 23:30:00')]
})
[Out]:
queue_ist_dt
0 2021-01-01 10:01:00
1 2021-01-01 10:35:00
2 2021-01-01 11:19:00
3 2021-01-01 11:33:00
4 2021-01-01 23:23:00
5 2021-01-01 23:22:00
6 2021-01-01 23:55:00
一種方法是使用pandas.Series.dt.round
如下
df['round_off_time'] = df['queue_ist_dt'].dt.round('30min')
[Out]:
queue_ist_dt round_off_time
0 2021-01-01 10:01:00 2021-01-01 10:00:00
1 2021-01-01 10:35:00 2021-01-01 10:30:00
2 2021-01-01 11:19:00 2021-01-01 11:30:00
3 2021-01-01 11:33:00 2021-01-01 11:30:00
4 2021-01-01 23:23:00 2021-01-01 23:30:00
5 2021-01-01 23:22:00 2021-01-01 23:30:00
6 2021-01-01 23:55:00 2021-01-02 00:00:00
如果目標是更改列中的值queue_ist_dt
,請執行以下操作
df['queue_ist_dt'] = df['queue_ist_dt'].dt.round('30min')
[Out]:
queue_ist_dt
0 2021-01-01 10:00:00
1 2021-01-01 10:30:00
2 2021-01-01 11:30:00
3 2021-01-01 11:30:00
4 2021-01-01 23:30:00
5 2021-01-01 23:30:00
6 2021-01-02 00:00:00
uj5u.com熱心網友回復:
邏輯是從 timedelta 中減去 30 分鐘
代碼如下:
for r in range(df.shape[0]):
try:
if df.loc[r,'queue_ist_dt'].minute<30:
timedelta = pd.Timedelta(minutes=df.loc[r,'queue_ist_dt'].minute)
df.loc[r,'queue_placed_interval'] = df.loc[r,'queue_ist_dt']- timedelta
elif df.loc[r,'queue_ist_dt'].minute>30:
******THIS LOGIC******
timedelta = pd.Timedelta(minutes=df.loc[r,'queue_ist_dt'].minute)
df.loc[r,'queue_placed_interval'] = df.loc[r,'queue_ist_dt']- (timedelta-30)
except:
pass
讓我知道這是否對您有幫助??
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/525416.html
標籤:Python熊猫
上一篇:為什么User.FindFirstValue(claimtypes.nameidentifier)總是回傳null?