Pandas:如何提取和计算Dataframe中每行的“小时”数
Pandas: How to extract and calculate the number of “hour” per row in a Dataframe
我有一个数据框表示一周内一些餐厅的时间表。
- 我想要做的是在我的初始 Dataframe
df
中添加一列 week_hours
,代表餐厅每周营业的总小时数。
注意 : 值 0 仅表示餐厅当天关闭。
data = {
'restaurant_id': ['1', '2','3'],
'Monday': ['11:0-20:0', '11:30-22:0','11:30-21:0'],
'Tuesday': ['11:0-20:0', '11:30-22:0','11:30-22:0'],
'Wednesday': ['11:0-20:0', '11:30-22:0','11:30-21:0'],
'Thursday': ['11:0-20:0', '11:30-22:0','11:30-21:0'],
'Friday': ['11:0-22:0', '11:30-22:0','11:30-21:0'],
'Saturday': ['11:0-22:0', '12:0-22:0','0'],
'Sunday': ['11:0-17:0', '16:30-21:30','11:30-21:0',],
}
df = pd.DataFrame (data, columns = ['restaurant_id','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday',])
df.head()
实现此目的的简单语法是什么?
您可以使用 apply
,请参阅此答案了解更多信息 。
def calc_hours(ranges):
# calc the hours in the ranges and sum
df['Weekly Hours'] = df.apply(lambda x: sum(calc_hours(x[day]) for day in ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']), axis=1)
一种方法是先 transpose
然后创建自定义函数 extract
计算前的值(请注意,这仅在小时数不超过 24 时有效,否则需要 Timedelta
):
def find_diff(col):
data = col.str.extract(r"(\d*):(\d*)-(\d*):(\d*)").astype(float)
hours = (data[2] - data[0]).sum()
minutes = (data[3] - data[1]).sum()/60
return hours+minutes
print (df.set_index("restaurant_id").T.apply(find_diff))
restaurant_id
1 64.0
2 67.5
3 58.0
dtype: float64
我有一个数据框表示一周内一些餐厅的时间表。
- 我想要做的是在我的初始 Dataframe
df
中添加一列week_hours
,代表餐厅每周营业的总小时数。
注意 : 值 0 仅表示餐厅当天关闭。
data = {
'restaurant_id': ['1', '2','3'],
'Monday': ['11:0-20:0', '11:30-22:0','11:30-21:0'],
'Tuesday': ['11:0-20:0', '11:30-22:0','11:30-22:0'],
'Wednesday': ['11:0-20:0', '11:30-22:0','11:30-21:0'],
'Thursday': ['11:0-20:0', '11:30-22:0','11:30-21:0'],
'Friday': ['11:0-22:0', '11:30-22:0','11:30-21:0'],
'Saturday': ['11:0-22:0', '12:0-22:0','0'],
'Sunday': ['11:0-17:0', '16:30-21:30','11:30-21:0',],
}
df = pd.DataFrame (data, columns = ['restaurant_id','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday',])
df.head()
实现此目的的简单语法是什么?
您可以使用 apply
,请参阅此答案了解更多信息
def calc_hours(ranges):
# calc the hours in the ranges and sum
df['Weekly Hours'] = df.apply(lambda x: sum(calc_hours(x[day]) for day in ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']), axis=1)
一种方法是先 transpose
然后创建自定义函数 extract
计算前的值(请注意,这仅在小时数不超过 24 时有效,否则需要 Timedelta
):
def find_diff(col):
data = col.str.extract(r"(\d*):(\d*)-(\d*):(\d*)").astype(float)
hours = (data[2] - data[0]).sum()
minutes = (data[3] - data[1]).sum()/60
return hours+minutes
print (df.set_index("restaurant_id").T.apply(find_diff))
restaurant_id
1 64.0
2 67.5
3 58.0
dtype: float64