簡體   English   中英

熊貓根據條件更改時間值

[英]Pandas change time values based on condition

我有一個數據框:

data = {'time':['08:45:00', '09:30:00', '18:00:00', '15:00:00']}
df = pd.DataFrame(data)

我想根據條件轉換時間:如果小時小於 9,我想將其設置為 9,如果小時大於 17,我需要將其設置為 17。

我嘗試了這種方法:

df['time'] = np.where(((df['time'].dt.hour < 9) & (df['time'].dt.hour != 0)), dt.time(9, 00))

我收到一個錯誤:只能使用 .dt。 具有類似日期時間的值的訪問器。

誰能幫我解決這個問題? 謝謝。

這是一種解決您的問題的方法:

df.time = pd.to_datetime(df.time)
df.loc[df.time.dt.hour < 9, 'time'] = (df.time.astype('int64') + (9 - df.time.dt.hour)*3600*1000000000).astype('datetime64[ns]')
df.loc[df.time.dt.hour > 17, 'time'] = (df.time.astype('int64') + (17 - df.time.dt.hour)*3600*1000000000).astype('datetime64[ns]')

輸入:

                 time
0 2022-06-06 08:45:00
1 2022-06-06 09:30:00
2 2022-06-06 18:00:00
3 2022-06-06 15:00:00

輸出:

                 time
0 2022-06-06 09:45:00
1 2022-06-06 09:30:00
2 2022-06-06 17:00:00
3 2022-06-06 15:00:00

更新:

這是嘗試解決 OP 錯誤的替代代碼,如評論中所述:

import pandas as pd
import datetime

data = {'time':['08:45:00', '09:30:00', '18:00:00', '15:00:00']}
df = pd.DataFrame(data)
print('', 'df loaded as strings:', df, sep='\n')

df.time = pd.to_datetime(df.time, format='%H:%M:%S')
print('', 'df converted to datetime by pd.to_datetime():', df, sep='\n')
df.loc[df.time.dt.hour < 9, 'time'] = (df.time.astype('int64') + (9 - df.time.dt.hour)*3600*1000000000).astype('datetime64[ns]')
df.loc[df.time.dt.hour > 17, 'time'] = (df.time.astype('int64') + (17 - df.time.dt.hour)*3600*1000000000).astype('datetime64[ns]')
df.time = [time.time() for time in pd.to_datetime(df.time)]
print('', 'df with time column adjusted to have hour between 9 and 17, converted to type "time":', df, sep='\n')

輸出:


df loaded as strings:
       time
0  08:45:00
1  09:30:00
2  18:00:00
3  15:00:00

df converted to datetime by pd.to_datetime():
                 time
0 1900-01-01 08:45:00
1 1900-01-01 09:30:00
2 1900-01-01 18:00:00
3 1900-01-01 15:00:00

df with time column adjusted to have hour between 9 and 17, converted to type "time":
       time
0  09:45:00
1  09:30:00
2  17:00:00
3  15:00:00

更新#2

不僅要更改窗口外時間的小時數,還要簡單地將 9:00 和 17:00 分別應用為最小和最大時間(請參閱 OP 對此的評論),您可以這樣做:

df.loc[df['time'].dt.hour < 9, 'time'] = pd.to_datetime(pd.DataFrame({
    'year':df['time'].dt.year, 'month':df['time'].dt.month, 'day':df['time'].dt.day, 
    'hour':[9]*len(df.index)}))
df.loc[df['time'].dt.hour > 17, 'time'] = pd.to_datetime(pd.DataFrame({
    'year':df['time'].dt.year, 'month':df['time'].dt.month, 'day':df['time'].dt.day, 
    'hour':[17]*len(df.index)}))
df['time'] = [time.time() for time in pd.to_datetime(df['time'])]

由於您'time'列包含字符串,它們可以保存為字符串並在適當的情況下分配新的字符串值。 要過濾您的標准,很方便:從'time'列創建日期時間系列,通過將日期時間系列與您的標准進行比較來創建布爾系列,使用布爾系列過濾需要更改的行。

您的數據:

import numpy as np
import pandas as pd

data = {'time':['08:45:00', '09:30:00', '18:00:00', '15:00:00']}
df = pd.DataFrame(data)
print(df.to_string())

>>>
       time
0  08:45:00
1  09:30:00
2  18:00:00
3  15:00:00

轉換為日期時間,根據您的標准制作布爾系列

dts = pd.to_datetime(df['time'])
lt_nine = dts.dt.hour < 9
gt_seventeen = (dts.dt.hour >= 17)
print(lt_nine)
print(gt_seventeen)

>>>
0     True
1    False
2    False
3    False
Name: time, dtype: bool
0    False
1    False
2     True
3    False
Name: time, dtype: bool

使用布爾系列分配一個新值:

df.loc[lt_nine,'time'] = '09:00:00'
df.loc[gt_seventeen,'time'] = '17:00:00'
print(df.to_string())

>>>
       time
0  09:00:00
1  09:30:00
2  17:00:00
3  15:00:00

或者完全堅持使用字符串並使用正則表達式模式和.str.match創建布爾系列。

data = {'time':['08:45:00', '09:30:00', '18:00:00', '15:00:00','07:22:00','22:02:06']}
dg = pd.DataFrame(data)
print(dg.to_string())

>>>
       time
0  08:45:00
1  09:30:00
2  18:00:00
3  15:00:00
4  07:22:00
5  22:02:06


# regex patterns
pattern_lt_nine = '^00|01|02|03|04|05|06|07|08'
pattern_gt_seventeen = '^17|18|19|20|21|22|23'

制作布爾系列並分配新值

gt_seventeen = dg['time'].str.match(pattern_gt_seventeen)
lt_nine = dg['time'].str.match(pattern_lt_nine)
dg.loc[lt_nine,'time'] = '09:00:00'
dg.loc[gt_seventeen,'time'] = '17:00:00'
print(dg.to_string())

>>>
       time
0  09:00:00
1  09:30:00
2  17:00:00
3  15:00:00
4  09:00:00
5  17:00:00

時間序列/日期功能
處理文本數據

暫無
暫無

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

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