【问题标题】:Convert Date (YYYY MM DD HH:MM:SS) to Decimal Day (YYYY MM DD.ddddd)将日期 (YYYY MM DD HH:MM:SS) 转换为十进制日 (YYYY MM DD.ddddd)
【发布时间】:2015-04-16 18:58:44
【问题描述】:

我构建了一个脚本,该脚本获取望远镜观测的日期和时间,并将其转换为带有小数日的日期。该脚本还占用了一半的曝光时间,并将其添加到小数点后,以便我可以得到最准确的天体测量计算。然后将其提交给仅接受年月日观测时间的小行星中心。XXXXX 最精确的 5 位小数点是什么?这是我目前使用的方式,是的,它非常混乱,但它确实让我得到了小数日。有时它会在时间转换中关闭一秒。

expmpc = float.("10")
utcstartmpc = "05:45:19.03"
datempc = "2015-02-14"


ddexposure = expmpc/(60.0*60.0*24.0)
ddexposure = round(ddexposure, 5)
seconds = int(utcstartmpc[6:8]) / 60.0
minutes = (int(utcstartmpc[3:5]) + seconds) / 60
hours = (int(utcstartmpc[:2]) + minutes) / 24
hours = round(hours, 5)
expadd = str(hours + ddexposure)
datempc = datempc.replace("-", " ")
utcmpc = "C%s%s" % (datempc, expadd[1:])
utcmpc = utcmpc.ljust(17, "0")

正如您所看到的,这非常混乱,它涉及对大量数据进行四舍五入,我相信我在四舍五入时会失去准确性。代码的最终结果留下了这样的时间: C2015 02 14.23986

有没有更好的模块?

感谢您的帮助。

【问题讨论】:

标签: python date decimal astronomy


【解决方案1】:

这是使用更多内置时间/日期模块的东西(我认为它可以满足您的需求):

import time
import datetime

def my_date_converter(date_in):
    parse_str, _ = date_in.split(".")
    date_str, time_str = parse_str.split(" ")
    parsed_time = time.strptime(time_str, "%H:%M:%S")
    total_seconds = datetime.timedelta(hours=parsed_time.tm_hour,minutes=parsed_time.tm_min,seconds=parsed_time.tm_sec).total_seconds()
    seconds_in_day = 86400.0
    decimal_seconds = total_seconds / seconds_in_day
    utcmpc = "C%s%s" % (date_str.replace("-", " "), str(round(decimal_seconds, 5))[1:])
    utcmpc = utcmpc.ljust(17, "0")
    return utcmpc


def main():
    to_convert = "2015-02-14 05:45:19.03"
    converted = my_date_converter(to_convert)
    print "%s => %s" % (to_convert, converted)

if __name__ == '__main__':
    main()

示例输出:2015-02-14 05:45:19.03 => C2015 02 14.23980

【讨论】:

    【解决方案2】:

    您尝试过优秀的astropy 库吗?他们有一个处理时间和转换的包:astropy.time

    【讨论】:

      【解决方案3】:

      您可以将您的问题分为 2 个任务:

      • 从输入expmpcutcstartmpcdatempc获取代表UTC时间的datetime对象
      • 将日期时间对象转换为Year Month Day.XXXXX格式的字符串。

      从输入expmpcutcstartmpcdatempc获取datetime对象

      from datetime import datetime, timedelta
      
      expmpc = "10"
      utcstartmpc = "05:45:19.03"
      datempc = "2015-02-14"
      dt = datetime.strptime(datempc + " " + utcstartmpc, "%Y-%m-%d %H:%M:%S.%f")
      dt += timedelta(seconds=int(expmpc))
      

      datetime对象转换为Year Month Day.XXXXX格式的字符串

      from datetime import datetime, time, timedelta
      
      s = dt.strftime("C%Y %m %d.")
      day_fraction =  dt - datetime.combine(dt, time.min)
      s += ("%.0f" % (100000*day_fraction / timedelta(days=1)))
      # -> C2015 02 14.23992
      

      注意:结果与您的问题中的结果略有不同(9286 在末尾)。

      在 Python 2 中,您需要将 td / timedelta(1) 替换为 td.total_seconds() / 86400

      这是另一种方式:

      >>> from __future__ import division
      >>> assert day_fraction.days == 0
      >>> '%.0f' % ((day_fraction.seconds*10**6 + day_fraction.microseconds) / 864000)
      '23992'
      

      真正除法之前的所有算术运算都以无限精度执行。

      另一种方式也产生92

      >>> from datetime import timezone
      >>> ('%.5f' % ((dt.replace(tzinfo=timezone.utc).timestamp() % 86400) / 86400))[2:]
      '23992'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-10
        • 1970-01-01
        • 2016-05-13
        • 2013-05-01
        • 2019-01-14
        • 1970-01-01
        相关资源
        最近更新 更多