هل هناك أي طريقة لاستخدام وظيفة تشبه STRFTIME للتواريخ قبل 1900 في بيثون؟
-
10-07-2019 - |
سؤال
لم أكن أدرك هذا، ولكن على ما يبدو وظيفة strftime
بايثون لا يدعم التواريخ قبل 1900:
>>> from datetime import datetime
>>> d = datetime(1899, 1, 1)
>>> d.strftime('%Y-%m-%d')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: year=1899 is before 1900; the datetime strftime() methods require year >= 1900
وأنا متأكد من أني يمكن أن الإختراق معا شيء نفسي للقيام بذلك، ولكن أنا الرقم وظيفة strftime
هناك لسبب ما (وهناك أيضا سبب لماذا لا يمكن أن تدعم مواعيد ما قبل 1900). أنا بحاجة إلى أن تكون قادرة على دعم التواريخ قبل 1900. كنت مجرد استخدام str
، ولكن هناك الكثير من الاختلاف. وبعبارة أخرى، قد تكون أو لا تكون ميكروثانية أو قد أو قد لا يكون لها توقيت. هل هناك أي حل لهذا؟
إذا أنه يحدث فرقا، وأنا أفعل هذا حتى أستطيع أن إرسال البيانات إلى ملف نصي وتحميله في قاعدة بيانات باستخدام أوراكل SQL * لودر.
وانتهى الأمر به أساسا الجواب أليكس مارتيلي و. وهنا تنفيذ أكثر اكتمالا:
>>> from datetime import datetime
>>> d = datetime.now()
>>> d = d.replace(microsecond=0, tzinfo=None)
>>> str(d)
'2009-10-29 11:27:27'
والفرق الوحيد هو أن str(d)
ما يعادل d.isoformat(' ')
.
المحلول
isoformat يعمل على الحالات datetime
ث / س الحد من نطاق:
>>> import datetime
>>> x=datetime.datetime(1865, 7, 2, 9, 30, 21)
>>> x.isoformat()
'1865-07-02T09:30:21'
إذا كنت في حاجة الى سلسلة شكل مختلف ليس من الصعب جدا لشريحة، الزهر وقطع ريميكس من السلسلة التي تحصل عليها من isoformat
، وهو ما يتسق جدا (YYYY-MM-DDTHH:MM:SS.mmmmmm
، مع نقطة وميكروثانية التالية حذفت إذا ميكروثانية صفر).
نصائح أخرى
والوثائق rel="noreferrer"> href="http://docs.python.org/library/datetime.html#strftime-behavior"
<اقتباس فقرة> ومجموعة المحدد من السنوات التي strftime()
يعمل أيضا يختلف عبر منصات. بغض النظر عن المنصة، سنوات قبل 1900 لا يمكن استخدامها.
وحتى لا يكون هناك لن يكون حلا يستخدم strftime()
. لحسن الحظ، انها واضحة جدا للقيام بذلك "باليد":
>>> "%02d-%02d-%02d %02d:%02d" % (d.year,d.month,d.day,d.hour,d.minute)
'1899-01-01 00:00'
mxDateTime
يمكن معالجة التواريخ التعسفية. استخدام time
وdatetime
حدات بايثون UNIX الطوابع داخليا، وهذا هو السبب في أنها مجموعة محدودة.
In [5]: mx.DateTime.DateTime(1899)
Out[5]: <mx.DateTime.DateTime object for '1899-01-01 00:00:00.00' at 154a960>
In [6]: DateTime.DateTime(1899).Format('%Y-%m-%d')
Out[6]: 1899-01-01
وهذا من في مصدر matplotlib . يمكن أن يوفر نقطة انطلاق جيدة لالمتداول بنفسك.
def strftime(self, dt, fmt):
fmt = self.illegal_s.sub(r"\1", fmt)
fmt = fmt.replace("%s", "s")
if dt.year > 1900:
return cbook.unicode_safe(dt.strftime(fmt))
year = dt.year
# For every non-leap year century, advance by
# 6 years to get into the 28-year repeat cycle
delta = 2000 - year
off = 6*(delta // 100 + delta // 400)
year = year + off
# Move to around the year 2000
year = year + ((2000 - year)//28)*28
timetuple = dt.timetuple()
s1 = time.strftime(fmt, (year,) + timetuple[1:])
sites1 = self._findall(s1, str(year))
s2 = time.strftime(fmt, (year+28,) + timetuple[1:])
sites2 = self._findall(s2, str(year+28))
sites = []
for site in sites1:
if site in sites2:
sites.append(site)
s = s1
syear = "%4d" % (dt.year,)
for site in sites:
s = s[:site] + syear + s[site+4:]
return cbook.unicode_safe(s)
وهذا هو "ميزة" من مكتبة ctime (UTF). أيضا قد يكون لديك مشكلة فوق 2038.