Is there an easy way to convert an RFC 3339 nano time into a regular Python timestamp?
For example, time = '2022-07-14T12:01:25.225089838 08:00', I found a way using datetime
from datetime import datetime
time = '2022-07-14T12:01:25.225089 08:00'
date = datetime.fromisoformat(time) # good
time = '2022-07-14T12:01:25.225089838 08:00'
date = datetime.fromisoformat(time) # error
It works with string like '2022-07-14T12:01:25.225089 08:00', but it doesn't work with the time above.
CodePudding user response:
from datetime.fromisoformat docs:
Caution: This does not support parsing arbitrary ISO 8601 strings - it is only intended as the inverse operation of datetime.isoformat(). A more full-featured ISO 8601 parser, dateutil.parser.isoparse is available in the third-party package dateutil.
dateutil's isoparse will do the job:
from dateutil.parser import isoparse
time = '2022-07-14T12:01:25.225089838 08:00'
date = isoparse(time)
print(date)
# 2022-07-14 12:01:25.225089 08:00
print(repr(date))
# datetime.datetime(2022, 7, 14, 12, 1, 25, 225089, tzinfo=tzoffset(None, 28800))
Note: it doesn't round to microseconds, it just slices off the last 3 decimal places. So basically, if you're dealing with a standardized format like RFC 3339, you can do the slicing yourself like
from datetime import datetime
time = '2022-07-14T12:01:25.225089838 08:00'
date = datetime.fromisoformat(time[:-9] time[-6:])
print(date)
# 2022-07-14 12:01:25.225089 08:00
CodePudding user response:
There are a few ways to do it. Depends on what is the input format and how you define an easy way. There are actually many post asking similar issues you have. I'll post a few at the end for your reference if you are interested and please check next time before posting.
The main issue of datetime object is that it only holds 6 digit after second. You will need a different data structure to save it if you want to preserve all of the digits.
If you are ok with cutting off with 6 digit, FObersteiner's answer is perfect. Another methodology is vanilla datetime string parsing
from datetime import datetime
date = '2022-07-14T12:01:25.225089838 08:00'.removesuffix(' 08:00')
x = datetime.strptime( date[:-3], '%Y-%m-%dT%H:%M:%S.%f')
If you would like to preserve all the digits. You may want to create your own class extending from the datetime class or create some function for it.