在 pandas 数据帧中操作时间范围
Manipulate time-range in a pandas Dataframe
需要清理一个 csv 导入,这给了我一个时间范围(以字符串形式)。代码在底部;我目前在 df 上使用正则表达式和 replace()
来转换其他字符。只是不确定如何:
- select 当前 24 小时制数字并添加 :00
- 如何 select 12 小时制数字并使它们成为 24 小时制。
输入(来自 csv 导入):
break_notes
0 15-18
1 18.30-19.00
2 4PM-5PM
3 3-4
4 4-4.10PM
5 15 - 17
6 11 - 13
到目前为止,我已经得到它看起来像(删除空格,AM/PM,用冒号替换点):
break_notes
0 15-18
1 18:30-19:00
2 4-5
3 3-4
4 4-4:10
5 15-17
6 11-13
但是,我希望它看起来像这样('HH:MM-HH:MM' 格式):
break_notes
0 15:00-18:00
1 18:30-19:00
2 16:00-17:00
3 15:00-16:00
4 16:00-16:10
5 15:00-17:00
6 11:00-13:00
我的代码是:
data = pd.read_csv('test.csv')
data.break_notes = data.break_notes.str.replace(r'([P].|[ ])', '').str.strip()
data.break_notes = data.break_notes.str.replace(r'([.])', ':').str.strip()
根据您请求的输入数据,这是您需要的转换器函数。 convert_entry
获取完整的值条目,将其拆分为破折号,并将其结果传递给 convert_single
,因为一个条目的两半都可以单独转换。每次转换后,它都会用破折号将它们合并。
convert_single
使用正则表达式搜索时间字符串中的重要部分。
它以一些数字 \d+
(代表小时)开头,然后是可选的点或冒号以及更多数字 [.:]?(\d+)?
(代表分钟)。然后可选择上午或下午 (AM|PM)?
(在这种情况下只有下午是相关的)
import re
def convert_single(s):
m = re.search(pattern="(\d+)[.:]?(\d+)?(AM|PM)?", string=s)
hours = m.group(1)
minutes = m.group(2) or "00"
if m.group(3) == "PM":
hours = str(int(hours) + 12)
return hours.zfill(2) + ":" + minutes.zfill(2)
def convert_entry(value):
start, end = value.split("-")
start = convert_single(start)
end = convert_single(end)
return "-".join((start, end))
values = ["15-18", "18.30-19.00", "4PM-5PM", "3-4", "4-4.10PM", "15 - 17", "11 - 13"]
for value in values:
cvalue = convert_entry(value)
print(cvalue)
需要清理一个 csv 导入,这给了我一个时间范围(以字符串形式)。代码在底部;我目前在 df 上使用正则表达式和 replace()
来转换其他字符。只是不确定如何:
- select 当前 24 小时制数字并添加 :00
- 如何 select 12 小时制数字并使它们成为 24 小时制。
输入(来自 csv 导入):
break_notes
0 15-18
1 18.30-19.00
2 4PM-5PM
3 3-4
4 4-4.10PM
5 15 - 17
6 11 - 13
到目前为止,我已经得到它看起来像(删除空格,AM/PM,用冒号替换点):
break_notes
0 15-18
1 18:30-19:00
2 4-5
3 3-4
4 4-4:10
5 15-17
6 11-13
但是,我希望它看起来像这样('HH:MM-HH:MM' 格式):
break_notes
0 15:00-18:00
1 18:30-19:00
2 16:00-17:00
3 15:00-16:00
4 16:00-16:10
5 15:00-17:00
6 11:00-13:00
我的代码是:
data = pd.read_csv('test.csv')
data.break_notes = data.break_notes.str.replace(r'([P].|[ ])', '').str.strip()
data.break_notes = data.break_notes.str.replace(r'([.])', ':').str.strip()
根据您请求的输入数据,这是您需要的转换器函数。 convert_entry
获取完整的值条目,将其拆分为破折号,并将其结果传递给 convert_single
,因为一个条目的两半都可以单独转换。每次转换后,它都会用破折号将它们合并。
convert_single
使用正则表达式搜索时间字符串中的重要部分。
它以一些数字 \d+
(代表小时)开头,然后是可选的点或冒号以及更多数字 [.:]?(\d+)?
(代表分钟)。然后可选择上午或下午 (AM|PM)?
(在这种情况下只有下午是相关的)
import re
def convert_single(s):
m = re.search(pattern="(\d+)[.:]?(\d+)?(AM|PM)?", string=s)
hours = m.group(1)
minutes = m.group(2) or "00"
if m.group(3) == "PM":
hours = str(int(hours) + 12)
return hours.zfill(2) + ":" + minutes.zfill(2)
def convert_entry(value):
start, end = value.split("-")
start = convert_single(start)
end = convert_single(end)
return "-".join((start, end))
values = ["15-18", "18.30-19.00", "4PM-5PM", "3-4", "4-4.10PM", "15 - 17", "11 - 13"]
for value in values:
cvalue = convert_entry(value)
print(cvalue)