Converting a string in to offset-aware datetime in python - python

I wanted to create a string time in to offset-aware timezone for comparing with another offset-aware datetime.
from datetime import datetime, timedelta
from dateutil import parser
from dateutil.tz import gettz
today = datetime.now(gettz()) # creating a offset-aware timezone, I wanted to create manual string time also in this format
new_date = parser.parse('Apr 1 2014') # I wanted this output to be converted into offset-aware timezone
output of today variable is = 2014-04-30 07:54:26.500678+05:30
output of new_date variable is = 2014-04-01 00:00:00 ( need to convert this into above format )
any other method for converting this ?

Related

Subtracting datetime in string format with datetime format

I have 2 variables.
One is datetime in string format and the other is datetime in datetime.datetime format.
For example -
2021-09-06T07:58:19.032Z # string
2021-09-05 14:58:10.209675 # datetime.datetime
I want to find out the difference between these 2 times in seconds.
I think we need to have both in datetime before we can do this subtraction.
I'm having a hard time converting the string to datetime.
Can someone please help.
You can convert the string into datetime object with strptime()
An example with your given dates:
from datetime import datetime
# Assuming this is already a datetime object in your code, you don't need this part
# I needed this part to be able to use it as a datetime object
date1 = datetime.strptime("2021-09-05 14:58:10.209675", "%Y-%m-%d %H:%M:%S.%f")
## The part where the string is converted to datetime object
# Since the string has "T" and "Z", we will have to remove them before we convert
formatted = "2021-09-06T07:58:19.032Z".replace("T", " ").replace("Z", "")
>>> 2021-09-06 07:58:19.032
# Finally, converting the string
date2 = datetime.strptime(formatted, "%Y-%m-%d %H:%M:%S.%f")
# Now date2 variable is a datetime object
# Performing a simple operation
print(date1 - date2)
>>> -1 day, 6:59:51.177675
Convert the str to datetime via strptime() and then get the difference of the 2 datetime objects in seconds via total_seconds().
from datetime import datetime, timezone
# Input
dt1_str = "2021-09-06T07:58:19.032Z" # String type
dt2 = datetime(year=2021, month=9, day=5, hour=14, minute=58, second=10, microsecond=209675, tzinfo=timezone.utc) # datetime type
# Convert the string to datetime
dt1 = datetime.strptime(dt1_str, "%Y-%m-%dT%H:%M:%S.%f%z")
# Subtract the datetime objects and get the seconds
diff_seconds = (dt1 - dt2).total_seconds()
print(diff_seconds)
Output
61208.822325
The first string time you mention could be rfc3339 format.
A module called python-dateutil could help
import dateutil.parser
dateutil.parser.parse('2021-09-06T07:58:19.032Z')
datetime module could parse this time format by
datetime.datetime.strptime("2021-09-06T07:58:19.032Z","%Y-%m-%dT%H:%M:%S.%fZ")
But this way may cause trouble when get a time in another timezone because it doesn't support timezone offset.

How to convert the local time into utc time in python

I am trying to convert the local time into UTC time. But getting the below error.
Error: an integer is required (got type str)
from datetime import datetime
starts_date = '2021-07-30 09:30:00'(timestamp without time zone)
ts = starts_date
x = datetime.utcfromtimestamp(ts)
x_ts = x.timestamp()
Be sure that datetime is imported correctly as from datetime import datetime. Can be a bit confusing but the method utcfromtimestamp belongs to datetime.datetime and not datetime itself.
Here is a working example to convert a timestamp of (now) to a UTC timestamp.
from datetime import datetime as dt
# Create a timestamp object for now.
ts = dt.timestamp(dt.now())
# Convert now to a UTC timestamp.
dt.utcfromtimestamp(ts).timestamp()
>>> 1627637013.657752
datetime.utcfromtimestamp() takes an integer that represent the amount of seconds passed since January 1st 1970.
This means with
from datetime import datetime as dt
print(dt.utcfromtimestamp(0))
you get
1970-01-01 00:00:00

Get only date from datetime generated string

I have a timestamp that was created with datetime module and now I need to convert '2020-10-08T14:52:49.387077+00:00' into 08/OCT/2020?
Can datetime do this? I have tried strptime but I think the +00:00 at the end is causing errors.
Use fromisoformat and strftime method from datetime package in Python 3.7:
from datetime import datetime
time = '2020-10-08T14:52:49.387077+00:00'
new_time = datetime.fromisoformat(time).strftime("%d/%b/%Y")
print(new_time)
Or with strptime:
from datetime import datetime
time = '2020-10-08T14:52:49.387077+00:00'
new_time = datetime.strptime(time.split('T')[0], "%Y-%m-%d").strftime("%d/%b/%Y")
print(new_time)
Output:
08/Oct/2020

Timedelta of datetime object and timezone object

I have a string datetime in YY/M/D/H which is already casted to PST timezone and saved. While reading it I am doing the following
submitted_time = '2020/02/13/11/16'
submitted_datetime = datetime.strptime(submitted_time, '%Y/%m/%d/%H/%M')
This time is already in PST timezone and to calculate the timedifference I tried doing the following :
from pytz import timezone
pacific = timezone('America/Los_Angeles')
today = datetime.now().astimezone(pacific)
But today - submitted_datetime won't work. I get the following error:
*** TypeError: can't subtract offset-naive and offset-aware datetimes
Is there a way I can get this working ? Any help is greatly appreciated.
With the code you provide, I doubt submitted_time will be interpreted as timezone aware, let alone PST. If you do convert it to a timezone aware datetime object, then the substraction works:
from datetime import datetime
from pytz import timezone
submitted_time = datetime.strptime('2020/02/13/11/16', '%Y/%m/%d/%H/%M')
pacific = timezone('America/Los_Angeles')
today = datetime.now().astimezone(pacific)
submitted_time = submitted_time.astimezone(pacific)
print(today - submitted_time)
Output:
5 days, 4:50:57.251801

python: convert date timestamp to epoch unix time and figure out number of days remaining?

I want to convert 2014-08-14 20:01:28.242 into a unix timestamp 245293529385 and subtract this by the current timestamp in order to figure out how many days have past and are ultimately remaining by subtracting this value from 14.
Scenario: user signs up and I want to count down the number of days remaining in their trial.
time.strptime to the rescue! Use the format string %Y-%m-%d %H:%M:%S.%f. For example:
import time
t = '2014-08-14 20:01:28.242'
ts = time.strptime(t, '%Y-%m-%d %H:%M:%S.%f')
timestamp = time.mktime(ts)
Now to convert it to a datetime (from: How do you convert a Python time.struct_time object into a datetime object? ):
from datetime import datetime
dt = datetime.fromtimestamp(timestamp)
There are two parts:
Convert input time string into datetime object
#!/usr/bin/env python
from datetime import datetime
dt = datetime.strptime('2014-08-14 20:01:28.242', '%Y-%m-%d %H:%M:%S.%f')
Convert datetime object to Unix time ("seconds since epoch")
The result depends on what time zone is used for the input time e.g., if the input is in UTC then the corresponding POSIX timestamp is:
timestamp = (dt - datetime(1970,1,1)).total_seconds()
# -> 1408046488.242
If your input is in the local timezone then see How do I convert local time to UTC in Python?

Categories

Resources