Python:查找本地平均时间(根据从时区子午线到位置的经度距离进行调整)

Python:查找本地平均时间(根据从时区子午线到位置的经度距离进行调整),python,time,timezone,latitude-longitude,Python,Time,Timezone,Latitude Longitude,我目前正在构建一个函数,输入(位置、时间)“城市、州、国家”和“年-月-日-小时:分钟:秒”,输出恒星时间,可用于天文计算。目前,我正在通过geopy传递位置以查找经度/纬度,然后使用timezonefinder查找准确的时区 在此基础上,我使用pytz将本地时间转换为UTC,同时考虑DST。我有一个数据库,我可以在其中找到恒星时间使用转换的时间和日期 我的问题是,准确地说,我不能使用本地时间,我需要使用本地平均时间,这是根据离时区子午线的距离调整的本地时间。例如,如果你所在城市的经度为-80,

我目前正在构建一个函数,输入(位置、时间)“城市、州、国家”和“年-月-日-小时:分钟:秒”,输出恒星时间,可用于天文计算。目前,我正在通过geopy传递位置以查找经度/纬度,然后使用timezonefinder查找准确的时区

在此基础上,我使用pytz将本地时间转换为UTC,同时考虑DST。我有一个数据库,我可以在其中找到恒星时间使用转换的时间和日期

我的问题是,准确地说,我不能使用本地时间,我需要使用本地平均时间,这是根据离时区子午线的距离调整的本地时间。例如,如果你所在城市的经度为-80,并且位于美国/纽约(东部时间),那么与太阳平行的经度为-75,这意味着相对于太阳,你实际上比东部时间早20分钟。但由于DST和时区在地图上并没有真正被视为统一的分段,我无法找到一种可靠的方法来计算这种差异

我能想到的最好的方法是把我的位置转换成长/纬度。找到那个位置的时区,然后把那个时区转换成子午线

我会将我的代码发布给那些能更好地处理视觉效果的人

from timezonefinder import TimezoneFinder
import geopy.geocoders, pytz, certifi, ssl, datetime, ephem, math

    def position(city, state, country):

    """

    :param city: String of city Ex. Chattannoga
    :param state: String of state Ex. TN
    :param country: String USA
    :return: latitude and longitude

    """

    ctx = ssl.create_default_context(cafile=certifi.where())
    geopy.geocoders.options.default_ssl_context = ctx
    geo_locator = geopy.geocoders.Nominatim(user_agent="my-application", scheme='http')
    location = geo_locator.geocode(city + ' ' + state + ' ' + country)

    return location.longitude, location.latitude


def timezone(longitude, latitude):

    """

    :param longitude:
    :param latitude:
    :return: timezone

    """

    tf = TimezoneFinder()
    zone = (tf.certain_timezone_at(lng=longitude, lat=latitude))

    return zone

# def localmeantime(longitude):
#     zones = [-0, -15, -30, -45, -60, -75, -90, -105, -120, -135, -150, -165, -180]
#     x = min(zones, key=lambda x: abs(x - longitude))
#     print(x)



def localtoutc(time, timezo):

    """

    :param time: Ex. "2001-2-3 10:11:12" String
    :param timezo: Ex. America/New_York String
    :return:

    """

    local = pytz.timezone(timezo)
    naive = datetime.datetime.strptime(time, "%Y-%m-%d %H:%M:%S")
    local_dt = local.localize(naive, is_dst=None)
    utc_dt = local_dt.astimezone(pytz.utc)
    return utc_dt
我能想到的另一种方法是找出位置是否在DST,然后通过计算经过了多少小时来找出子午线。每小时15度


我想知道是否有更好的方法来获取本地平均时间,或者是否有更简单的方法通过所有这些调整来获取恒星时间。

如果有人偶然发现这一点,我通过使用上面找到的世界时并减去经度x 4分钟来找到本地平均时间来解决我的问题

    def localmeantime(utc, longitude):
    """
    :param utc: string Ex. '2008-12-2'
    :param longitude: longitude
    :return: Local Mean Time Timestamp
    """
    lmt = utc + datetime.timedelta(seconds=round(4*60*longitude))
    lmt = lmt.replace(tzinfo=None)
    return lmt

你真的需要精确的(!)“”?你应该在找到答案,而“当地平均时间”并不意味着“它离时区子午线有多远”