Python 中的自然时间间隔处理
Natural time interval processing in Python
我想知道如何获取用户输入的字符串(即 1 day, 5 hours, 15 minutes, 2 seconds
)并将其转换为 timedelta
对象或(最好)该间隔中的秒数。
注意:
- 这不是关于 datetimes, it is about timedeltas 的问题。我不需要“明天”或“5 分钟后”,我需要“1 天”或“5 分钟”。
- 所有字段都是可选的
- 这些是可能的字段:
year
、years
或 y
month
、months
或 m
week
、weeks
或 w
day
、days
或 d
hour
、hours
或 h
minute
、minutes
或 m
second
、seconds
或 s
- 如果你能让我开始,我可能会做剩下的事情
- 输入可以用
,
或空格分隔
谢谢!
谢谢@y0prst for !
这里是,转换为程序:
import re, datetime
def get_seconds(text):
splitted_input = filter(None, re.split('[, ]', text))
assert len(splitted_input) % 2 == 0
grouped_input = zip(*(iter(splitted_input),) * 2)
# ⬆︎ This is tricky; see
kwargs = {
'year':0,
'month':0,
'day':0,
'hour':0,
'minute':0,
'second':0,
'microsecond':0,
}
for n, unit in grouped_input:
n = int(n)
if unit.startswith('y'):
kwargs['year'] += n
elif unit.startswith('mo'):
kwargs['month'] += n
elif unit.startswith('w'):
kwargs['day'] += 7*n
elif unit.startswith('d'):
kwargs['day'] += n
elif unit.startswith('h'):
kwargs['hour'] += n
elif unit.startswith('m'):
kwargs['minute'] += n
elif unit.startswith('s'):
kwargs['second'] += n
else:
assert False, unit
for k, v in kwargs:
kwargs[k] += getattr(now, k)
now = datetime.datetime.now()
return (datetime.datetime(**kwargs) - now).total_seconds()
你可以使用 parsedatetime
module:
#!/usr/bin/env python
from datetime import date, datetime
import parsedatetime as pdt # $ pip install parsedatetime
cal = pdt.Calendar()
midnight = datetime.fromordinal(date.today().toordinal())
for s in "1 day, 5 hours, 15 minutes, 2 seconds".split(', '):
print(repr(cal.parseDT(s, midnight)[0] - midnight))
输出
datetime.timedelta(1)
datetime.timedelta(0, 18000)
datetime.timedelta(0, 900)
datetime.timedelta(0, 2)
要获取秒数,请调用 .total_seconds()
或者如果您不需要几分之一秒;你可以截断它:
integer_seconds = td // timedelta(seconds=1)
我想知道如何获取用户输入的字符串(即 1 day, 5 hours, 15 minutes, 2 seconds
)并将其转换为 timedelta
对象或(最好)该间隔中的秒数。
注意:
- 这不是关于 datetimes, it is about timedeltas 的问题。我不需要“明天”或“5 分钟后”,我需要“1 天”或“5 分钟”。
- 所有字段都是可选的
- 这些是可能的字段:
year
、years
或y
month
、months
或m
week
、weeks
或w
day
、days
或d
hour
、hours
或h
minute
、minutes
或m
second
、seconds
或s
- 如果你能让我开始,我可能会做剩下的事情
- 输入可以用
,
或空格分隔
谢谢!
谢谢@y0prst for
这里是,转换为程序:
import re, datetime
def get_seconds(text):
splitted_input = filter(None, re.split('[, ]', text))
assert len(splitted_input) % 2 == 0
grouped_input = zip(*(iter(splitted_input),) * 2)
# ⬆︎ This is tricky; see
kwargs = {
'year':0,
'month':0,
'day':0,
'hour':0,
'minute':0,
'second':0,
'microsecond':0,
}
for n, unit in grouped_input:
n = int(n)
if unit.startswith('y'):
kwargs['year'] += n
elif unit.startswith('mo'):
kwargs['month'] += n
elif unit.startswith('w'):
kwargs['day'] += 7*n
elif unit.startswith('d'):
kwargs['day'] += n
elif unit.startswith('h'):
kwargs['hour'] += n
elif unit.startswith('m'):
kwargs['minute'] += n
elif unit.startswith('s'):
kwargs['second'] += n
else:
assert False, unit
for k, v in kwargs:
kwargs[k] += getattr(now, k)
now = datetime.datetime.now()
return (datetime.datetime(**kwargs) - now).total_seconds()
你可以使用 parsedatetime
module:
#!/usr/bin/env python
from datetime import date, datetime
import parsedatetime as pdt # $ pip install parsedatetime
cal = pdt.Calendar()
midnight = datetime.fromordinal(date.today().toordinal())
for s in "1 day, 5 hours, 15 minutes, 2 seconds".split(', '):
print(repr(cal.parseDT(s, midnight)[0] - midnight))
输出
datetime.timedelta(1)
datetime.timedelta(0, 18000)
datetime.timedelta(0, 900)
datetime.timedelta(0, 2)
要获取秒数,请调用 .total_seconds()
或者如果您不需要几分之一秒;你可以截断它:
integer_seconds = td // timedelta(seconds=1)