Datetime and suntime, TypeError: can't subtract offset-naive and offset-aware datetimes
Datetime and suntime, TypeError: can't subtract offset-naive and offset-aware datetimes
import datetime
from suntime import Sun, SunTimeException
from datetime import timedelta
def day_night_time(lat,long,TO_date,TO_time):
sun = Sun(lat,long)
date = datetime.date(int(TO_date[:4]), int(TO_date[5:7]), int(TO_date[8:10]))
TO = datetime.datetime(int(TO_date[:4]), int(TO_date[5:7]), int(TO_date[8:10]),int(TO_time[:2]), int(TO_time[3:5]))
day_sr = sun.get_local_sunrise_time(date)
day_ss = sun.get_local_sunset_time(date)
n_end = day_sr - timedelta(minutes=30)
n_start = day_ss + timedelta(minutes=30)
print(TO)
print(n_end)
# print(TO-n_end)
day_night_time(50,20,'2020-06-24','10:45:00.000000')
returns
2020-06-24 10:45:00
2020-06-24 02:02:00+00:00
我无法使用它,因为最后有 +00:00。删除 +00:00 或将其添加到其他日期的最佳方法是什么,以便可以使用它们。
当前错误:TypeError: can't subtract offset-naive and offset-aware datetimes
非常感谢您的帮助
我建议您也本地化 TO
,这样您就拥有所有可识别 tz 的日期时间对象。通过调用未指定时区的 astimezone()
方法,您可以轻松地将日期时间对象本地化为本地时区。我也自由地简化了代码:
from datetime import datetime, timedelta
from suntime import Sun
lat, long, TO_date, TO_time = 49.095, 8.437, '2020-06-24', '10:45:00.000000'
sun = Sun(lat, long)
# making use of input in ISO8601 compatible format,
# and localize to the local timezone:
TO = datetime.fromisoformat(TO_date + 'T' + TO_time).astimezone()
day_sr = sun.get_local_sunrise_time(TO) # 2020-06-24 05:23:00+02:00
day_ss = sun.get_local_sunset_time(TO) # 2020-06-24 21:35:00+02:00
n_end = day_sr - timedelta(minutes=30)
n_start = day_ss + timedelta(minutes=30)
print(TO)
print(n_end)
print(TO-n_end)
# 2020-06-24 10:45:00+02:00
# 2020-06-24 04:53:00+02:00
# 5:52:00
请注意,我还调整了 lat/lon,以便我可以验证 location/timezone 的结果。如 +02:00
所示,我使用的是 UTC+2 (CEST)。
另一个选项,如果你想使用所有天真的日期时间对象,是用 None
替换 tzinfo
属性。在上面的代码中,它看起来像
TO = datetime.fromisoformat(TO_date + 'T' + TO_time) # 2020-06-24 10:45:00
day_sr = sun.get_local_sunrise_time(TO).replace(tzinfo=None) # 2020-06-24 05:23:00
day_ss = sun.get_local_sunset_time(TO).replace(tzinfo=None) # 2020-06-24 21:35:00
这也很好,因为无论如何您只使用当地时间。
import datetime
from suntime import Sun, SunTimeException
from datetime import timedelta
def day_night_time(lat,long,TO_date,TO_time):
sun = Sun(lat,long)
date = datetime.date(int(TO_date[:4]), int(TO_date[5:7]), int(TO_date[8:10]))
TO = datetime.datetime(int(TO_date[:4]), int(TO_date[5:7]), int(TO_date[8:10]),int(TO_time[:2]), int(TO_time[3:5]))
day_sr = sun.get_local_sunrise_time(date)
day_ss = sun.get_local_sunset_time(date)
n_end = day_sr - timedelta(minutes=30)
n_start = day_ss + timedelta(minutes=30)
print(TO)
print(n_end)
# print(TO-n_end)
day_night_time(50,20,'2020-06-24','10:45:00.000000')
returns
2020-06-24 10:45:00
2020-06-24 02:02:00+00:00
我无法使用它,因为最后有 +00:00。删除 +00:00 或将其添加到其他日期的最佳方法是什么,以便可以使用它们。
当前错误:TypeError: can't subtract offset-naive and offset-aware datetimes
非常感谢您的帮助
我建议您也本地化 TO
,这样您就拥有所有可识别 tz 的日期时间对象。通过调用未指定时区的 astimezone()
方法,您可以轻松地将日期时间对象本地化为本地时区。我也自由地简化了代码:
from datetime import datetime, timedelta
from suntime import Sun
lat, long, TO_date, TO_time = 49.095, 8.437, '2020-06-24', '10:45:00.000000'
sun = Sun(lat, long)
# making use of input in ISO8601 compatible format,
# and localize to the local timezone:
TO = datetime.fromisoformat(TO_date + 'T' + TO_time).astimezone()
day_sr = sun.get_local_sunrise_time(TO) # 2020-06-24 05:23:00+02:00
day_ss = sun.get_local_sunset_time(TO) # 2020-06-24 21:35:00+02:00
n_end = day_sr - timedelta(minutes=30)
n_start = day_ss + timedelta(minutes=30)
print(TO)
print(n_end)
print(TO-n_end)
# 2020-06-24 10:45:00+02:00
# 2020-06-24 04:53:00+02:00
# 5:52:00
请注意,我还调整了 lat/lon,以便我可以验证 location/timezone 的结果。如 +02:00
所示,我使用的是 UTC+2 (CEST)。
另一个选项,如果你想使用所有天真的日期时间对象,是用 None
替换 tzinfo
属性。在上面的代码中,它看起来像
TO = datetime.fromisoformat(TO_date + 'T' + TO_time) # 2020-06-24 10:45:00
day_sr = sun.get_local_sunrise_time(TO).replace(tzinfo=None) # 2020-06-24 05:23:00
day_ss = sun.get_local_sunset_time(TO).replace(tzinfo=None) # 2020-06-24 21:35:00
这也很好,因为无论如何您只使用当地时间。