9

ephem を使用して日の出と日没を計算する例をここで見ましたが、うまく機能しています。

この 2 つの時間の中間点を計算しようとすると、問題が発生します。ここに私が持っているものがあります:

import datetime
import ephem

o = ephem.Observer()
o.lat, o.long, o.date = '37.0625', '-95.677068', datetime.datetime.utcnow()
sun = ephem.Sun(o)
print "sunrise:", o.previous_rising(sun), "UTC"
print "sunset:",o.next_setting(sun), "UTC"
print "noon:",datetime.timedelta((o.next_setting(sun)-o.previous_rising(sun))/2)

私は得る:

日の出: 2010/11/2 12:47:40 UTC
日没: 2010/11/2 23:24:25 UTC
正午: 5:18:22.679044

それが私が立ち往生しているところです。私は Python の初心者であり、率直に言って、一般的にはあまりプログラマーではありません。

どんな提案でも大歓迎です!

4

4 に答える 4

9

太陽正午は、日の出と日の入りの平均ではありません(説明については均時差を参照してください)。ephemパッケージには、代わりに使用する必要がある通過時間を取得するためのメソッドがあります。

>>> import ephem
>>> o = ephem.Observer()
>>> o.lat, o.long = '37.0625', '-95.677068'
>>> sun = ephem.Sun()
>>> sunrise = o.previous_rising(sun, start=ephem.now())
>>> noon = o.next_transit(sun, start=sunrise)
>>> sunset = o.next_setting(sun, start=noon)
>>> noon
2010/11/6 18:06:21
>>> ephem.date((sunrise + sunset) / 2)
2010/11/6 18:06:08

今日の正午は、日の出と日の入りの平均より (現在地で) 13 秒遅いことに注意してください。

(コードの行はephem.date((sunrise + sunset) / 2)、パッケージ内の日付を簡単に操作する方法を示してephemいます。それが正しいことである場合)。

于 2010-11-06T19:30:18.110 に答える
2

エフェムを使用することが難しい要件ではない場合、私は最近、太陽正午のネイティブ関数を直接持つdaylightというライブラリを作成しました。

>>> import daylight, pytz
>>> from datetime import datetime
>>> sun = daylight.Sunclock(37.0625, -95.677068)
>>> t = sun.solar_noon(datetime.utcnow().timestamp())
>>> datetime.utcfromtimestamp(t)
datetime.datetime(2020, 6, 4, 18, 20, 54)

上記の時間は UTC ではありません。より適切なタイムゾーン、たとえば EST については、次のことができます。

>>> tz = pytz.timezone('EST')
>>> tz_offset = tz.utcoffset(datetime.utcnow()).total_seconds()/3600
>>> sun = daylight.Sunclock(37.0625, -95.677068, tz_offset)
>>> t = sun.solar_noon(datetime.utcnow().timestamp())
>>> datetime.utcfromtimestamp(t).astimezone(tz)
datetime.datetime(2020, 6, 3, 7, 50, 54, tzinfo=<StaticTzInfo 'EST'>)

または、特定の日付、たとえば 2020 年 5 月 21 日にこれを行います。

>>> t = sun.solar_noon(datetime(2020, 5, 21).timestamp())
>>> datetime.utcfromtimestamp(t)
datetime.datetime(2020, 5, 20, 18, 19, 14)
于 2020-06-04T09:03:18.157 に答える
0

これはずっと前に答え​​られたことに気づきました。しかし、任意のコードを使用している可能性がある人や Python をよく理解していない人向けの回答から、均時差の目的に関する簡単な説明があります。平均太陽通過 (正午) は、経度の位置で発生します。つまり、経度を知っていれば、経度を 15.0 で割り、その値を 12 から引くだけで、平均太陽通過を求めることができます。これは、必要に応じて GMT または UTC の結果になり、時間を 10 進数で表します。あなたの真の太陽通過は、平均から均時差を引いた結果です。通常、ウィキペディアの式に示されているように、日の出と日の入りの時間を取得するには、とにかくこれを計算する必要があります。しかし、sunpyパッケージで少し問題が発生したため、pythonパッケージ情報に感謝します。ここに bitbucket に関する素晴らしいプログラムがあります https://bitbucket.org/cmcqueen1975/sundials/wiki/Home

于 2013-04-28T21:32:32.453 に答える
0

2 つの数値の平均は、日照時間を 2 で割ったものではなく、2 で割った数値の合計です。それを o.previous_rising(sun) に追加しても機能する可能性がありますが、直接平均を取るのと同じはずです (datetime オブジェクトを平均していることは問題ではありません)。

于 2010-11-02T22:36:17.327 に答える