Python Datetime和suntime,TypeError:can';t减去偏移量原始和偏移量感知日期时间

Python Datetime和suntime,TypeError:can';t减去偏移量原始和偏移量感知日期时间,python,datetime,python-datetime,timedelta,Python,Datetime,Python Datetime,Timedelta,返回 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])) T

返回

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')
我无法使用此选项,因为末尾有一次+00:00。删除+00:00或将其添加到其他日期以便使用的最佳方法是什么。 当前错误:
TypeError:无法减去偏移量初始和偏移量感知日期时间


非常感谢您的帮助

我建议您也将
本地化为
,这样您就拥有了所有tz感知的datetime对象。通过在不指定时区的情况下调用
astimezone()
方法,可以轻松地将datetime对象本地化为本地时区。我还自由地简化了代码:

2020-06-24 10:45:00                                                                                                                                                           
2020-06-24 02:02:00+00:00 
注意,我还调整了lat/lon,以便验证我所在位置/时区的结果。正如
+02:00
所示,我在UTC+2(CEST)上


如果要处理所有naive datetime对象,另一个选项是将
tzinfo
属性替换为
None
。在上面的代码中

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

这也很好,因为您只使用本地时间。

我建议您也将
本地化为
,这样您就可以拥有所有tz感知的datetime对象。通过在不指定时区的情况下调用
astimezone()
方法,可以轻松地将datetime对象本地化为本地时区。我还自由地简化了代码:

2020-06-24 10:45:00                                                                                                                                                           
2020-06-24 02:02:00+00:00 
注意,我还调整了lat/lon,以便验证我所在位置/时区的结果。正如
+02:00
所示,我在UTC+2(CEST)上


如果要处理所有naive datetime对象,另一个选项是将
tzinfo
属性替换为
None
。在上面的代码中

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
这也很好,因为你只在当地时间工作