-3

助けが必要です。次のように指定された特定の日付に相当する Excel 日付の方程式を実装するために、calcExcelDate という名前の定義済み関数を使用する PYTHON コードを作成しようとしています。

  • 年 (1900 から 9999 までの 4 桁の整数);
  • 月 (1 から 12 までの 1 桁または 2 桁の整数);
  • 日 (月に応じて、1 から 31 までの 1 桁または 2 桁の整数)。

関数を定義し、上記の年、月、日の範囲を指定する 3 つの for ループを使用しました。しかし、その関数を使用して、次の方程式を実装するにはどうすればよいですか。

y_2 = year - 1900
em = math.floor((14 - month) / 12)
y_3 = y_2 - em
m_2 = month + 12 * em
I_ = 1 + min(y_3, 0) + math.floor(y_3 / 4) - math.floor(y_3 / 100) + math.floor((y_3 + 300) / 400)
d_1 = math.floor(-1.63 + (m_2 - 1) * 30.6)
d_2 = day + y_3 * 365 + I_ + d_1

これまでの私のコード:

import time
import math


DAYS = ("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")
FULL_MONTHS = ("January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December")


mm_ = tuple(str(date) for date in range(2013-10-17, 2100-01-01))    # a tuple of character strings containing dates in the date range Excel supports,
                                                                    # such as ("2013-Oct-17", "2100-01-01")
print mm_


def calcExcelDate(year, month, day):

  for year in range(1900, 10000):
    for month in range(1, 13):
      for day in range(1, 32):
        y_2 = year - 1900
        em = math.floor((14 - month) / 12)
        y_3 = y_2 - em
        m_2 = month + 12 * em
        I_ = 1 + min(y_3, 0) + math.floor(y_3 / 4) - math.floor(y_3 / 100)
                           + math.floor((y_3 + 300) / 400)
        d_1 = math.floor(-1.63 + (m_2 - 1) * 30.6)
        d_2 = day + y_3 * 365 + I_ + d_1


xx_ = calcExcelDate(2010, 10, 1)
print xx_
4

1 に答える 1

0

このような場合は、処理したい日付と時刻のインターフェイスとして標準ライブラリのdatetimeを使用し、必要に応じて Excel のシリアル日付に変換することをお勧めします。

次のコードは、 XlsxWriterモジュールdatetimeで日付を Excel の日付に変換する方法を示しています。

def _convert_date_time(self, dt_obj):
    # We handle datetime .datetime, .date and .time objects but convert
    # them to datetime.datetime objects and process them in the same way.
    if isinstance(dt_obj, datetime.datetime):
        pass
    elif isinstance(dt_obj, datetime.date):
        dt_obj = datetime.datetime.fromordinal(dt_obj.toordinal())
    elif isinstance(dt_obj, datetime.time):
        dt_obj = datetime.datetime.combine(self.epoch, dt_obj)
    else:
        raise TypeError("Unknown or unsupported datetime type")

    # Convert a Python datetime.datetime value to an Excel date number.
    delta = dt_obj - self.epoch
    excel_time = (delta.days
                  + (float(delta.seconds)
                     + float(delta.microseconds) / 1E6)
                  / (60 * 60 * 24))

    # Special case for datetime where time only has been specified and
    # the default date of 1900-01-01 is used.
    if dt_obj.isocalendar() == (1900, 1, 1):
        excel_time -= 1

    # Account for Excel erroneously treating 1900 as a leap year.
    if not self.date_1904 and excel_time > 59:
        excel_time += 1

    return excel_time

を使用する利点は、datetime文字列を日付または時刻に解析するためのさまざまなメソッドを備えた標準インターフェイスがあることです。

my_datetime = datetime.datetime.strptime('2013-01-23', '%Y-%m-%d')
于 2013-10-18T09:12:23.333 に答える