Excel күн айырмашылығы төрт жыл: алдымен жұмыс кітабының күн жүйесін қараңыз
iso_dates файлдағы күнді сериялау әдісін басқарады және жадтағы күн уақытын жолға автоматты түрде айналдырмайды. Күннің сериялық нөмірі жұмыс кітабының дәуірін талап етеді; мұнда біз екі күн жүйесін салыстырамыз және сақталған XML және қайта қарау мәндерін тексереміз.
Excel бағдарламасы төрт жылға ауыстырылатын күндерді экспорттайды және көп жағдайда мәселе деректердің өзінде емес, жұмыс кітабының күндер жүйесінде болады. Есеп экспортына, ETL сценарийлеріне немесе Excel файлдарының кросс-платформа алмасуына жауапты әзірлеушілер мен деректер адамдары үшін жазылған. Жалпы күнді ауыстыру, күндер ретінде көрсетілмейтін сандар, 1900-ге жуық деректер ауытқулары және т.б. сияқты жағдайларға тап болсаңыз, алдымен осы мақаланың ретімен ақауларды жоюға болады.
Осы мақаланы оқығаннан кейін сіз 1900 және 1904 екі күн жүйесінің арасындағы айырмашылықты түсінесіз, ағымдағы жұмыс кітабы пайдаланатын жүйені растау үшін workbook.epoch қалай оқу керектігін білесіз және XML-ді тексеру және сақтаудан кейін мәндерді оқудың қабылдау әдісін меңгересіз. Осы мақаладағы код пен кестелер нақты құжаттармен жұмыс істеу алдында бақылау парағы ретінде жарамды синтетикалық үлгілермен суреттелген.
Excel күні төрт жыл басқаша болса, не істеуім керек? Бір сөйлемнен қорытынды
Алдымен жұмыс кітабының workbook.epoch оқып шығыңыз және түрлендіру алдында күн жүйесін растаңыз; шекаралық күн мен уақыт белдеуі мәселелері бөлек өңделеді.
| сіздің жағдайыңыз | Ұсынылатын тәжірибелер | себебі |
|---|---|---|
| Экспортталған күн жалпы алғанда шамамен 1462 күнге ауыстырылады | Жұмыс кітабының күн жүйесін растау үшін алдымен workbook.epoch оқыңыз | 1900 және 1904 жүйелерінің арасындағы айырмашылық 1462 күнді құрайды және оқу жағындағы қате болжамдар барлық сериялық нөмірлердің дұрыс түсіндірілуіне әкеледі. |
| Ұяшық сан, бірақ оны күн ретінде көрсету мүмкін емес | number_format күн пішімінің маскасын тексеріңіз және толтырыңыз | Сандық түр дұрыс болса, жетіспейтін пішімдер дисплейдегі ауытқуларды тудырады. |
| Деректерде 1900 жылдың наурызына дейінгі немесе 1900-02-29 күндері көрсетілген | Жарамсыз деп белгілеңіз немесе қолмен қарауға жіберілді, бастапқы сериялық нөмірді сақтаңыз | Бұл күн Григориан күнтізбесінде жоқ және оны өзгертуге мәжбүрлемеу керек |
Уақыт белдеуі бар datetime жазылуы керек | Бірыңғай UTC түрлендіруден кейін tzinfo сызып тастаңыз | Excel бағдарламасы уақыт белдеулерін сақтауды қолдамайды, барлық уақыт жергілікті уақыт болып табылады |
| Файлдар платформалар арқылы алмасуы керек | Күнді нақты жариялау жүйесі | Ресивердің әдепкі параметрлері әртүрлі, бұл дыбыссыз ауытқуды тудыруы мүмкін |
1900 және 1904 күндер жүйелерінің арасындағы айырмашылықтар
XLSX файлындағы күн негізінен өзгермелі нүктелі сериялық нөмір болып табылады және оның мағынасы толығымен жұмыс кітабы байланыстырылған күн жүйесіне байланысты. XLSX спецификациясы екі негізгі дәуірге мүмкіндік береді:
- 1900 Date System: Windows жүйесі әдепкі бойынша пайдаланылады, сериялық нөмір 1 1900-01-01-ді білдіреді
- 1904 күн жүйесі: ерте Mac компьютерлерінде әдепкі бойынша пайдаланылады, сериялық нөмір 0 1904-01-01-ді білдіреді
Екеуінің арасында 1462 күннің тұрақты ығысуы бар, бұл «төрт жылдың күн айырмашылығының» негізгі көзі болып табылады. Сонымен қатар, 1900 жүйесінде тарихи мәселе бар: ол 1900 жылды кібісе жыл ретінде дұрыс қарастырмайды, бұл Excel бағдарламасында жоқ 1900-02-29 күнінің заңдастырылуына себеп болды.
Негізгі салыстыру
| жоба | 1900 күн жүйесі | 1904 жылғы дата жүйесі |
|---|---|---|
| Сериялық нөмірдің бастапқы нүктесі | Сериялық нөмірі 1 1900-01-01 сәйкес келеді | Сериялық нөмірі 0 1904-01-01 сәйкес келеді |
| Жалпы әдепкі көздер | Windows | Ерте Mac |
| басқа жүйеден офсет | 1462 күн айырмашылық | 1462 күн айырмашылық |
| ерекше мәселелер | 1900 жыл кібісе жыл деп қателесті, 1900-02-29 бар | Бұл мақалада мұндай мәселелер қарастырылмаған |
Неліктен 1900 жылға дейінгі деректер ерекше күтімді қажет етеді
1900 жылдың наурызына дейінгі тарихи деректермен айналысатын болсаңыз, Python-ның datetime модулі 29 ақпанды тікелей көрсете алмайды. Ресми openpyxl құжаттамасына сәйкес, Excel мінез-құлқымен үйлесімді болу үшін кітапхана 1900 жүйесі бойынша қаңтар және ақпан айларындағы күндерді оқу кезінде осы ерекшелікті имитациялайды, бірақ 1900-02-29 өзін жарамды Python datetime нысанына түрлендіру мүмкін емес.
Қазіргі заманғы бизнес деректерінің көпшілігі үшін негізгі мәселе ағымдағы жұмыс кітабының қай жүйені пайдаланып жатқанын анықтау және әртүрлі әдепкі параметрлерге байланысты қабылдау жақтағы үнсіз дрейфті болдырмау үшін платформалар арқылы файлдармен алмасу кезінде оны анық жариялау болып табылады.
Синтез мысалы: шекаралық енгізу және өңдеу әдістері
Мәселені суреттеу үшін біз синтетикалық сценарийді құрастырамыз: қаржы жүйесі экспорттаған есеп 1904 күн жүйесін пайдаланады, бірақ төменгі ағындағы ETL сценарийі оны әдепкі бойынша 1900 жүйесіне сәйкес талдайды.
Қатені немесе шекаралық енгізуді өңдеу:
- Егер кіріс сериялық нөмірі 60 болса және жұмыс кітабы 1900 жүйесіне арналған болса, ол Excel бағдарламасындағы ойдан шығарылған 1900-02-29 нұсқасына сәйкес келеді. Python-ның түпнұсқасы
datetimeValueErrorлақтырады. - Бұл уақытта ерекшелік мәжбүрлеуге болмайды, бірақ ерекшелік ұсталып, бастапқы мән немесе арнайы белгі ретінде жазылуы керек, себебі бұл күн Григориан күнтізбесінде жоқ.
- Жазу үшін уақыт белдеуі ақпараты бар
datetimeнысаны жіберілсе, openpyxl уақыт белдеуін автоматты түрде түрлендірмейді, бірақ алдымен tzinfo өшірілуін талап етеді, әйтпесе жазу қатесі немесе қате орын алуы мүмкін. - Excel бағдарламасының өзі уақыт белдеуін сақтауды қолдамайды және барлық уақыт хабарсыз жергілікті уақыт болып табылады.
Күн жүйесін анықтау және қауіпсіз түрлендіру коды
Келесі мысал жадтағы күн жүйесінің айырмашылығын қауіпсіз өңдеу жолын көрсетеді. Код тек логикалық демонстрацияға арналған және нақты файлды оқу мен жазуды орындамайды. Оны өзіңіздің құлыпталған тәуелділік ортаңызда іске қосу керек. Openpyxl >= 3.1.0 ұсынылады. Мысалдар желілік сұрауларды немесе файлды қайта жазу әрекеттерін қамтымайды, барлық бекітулер синтетикалық деректерге негізделген.
from datetime import datetime
from io import BytesIO
from zipfile import ZipFile
from openpyxl import Workbook, load_workbook
from openpyxl.utils.datetime import from_excel, CALENDAR_MAC_1904, CALENDAR_WINDOWS_1900
assert from_excel(1, CALENDAR_MAC_1904) == datetime(1904, 1, 2)
assert from_excel(1, CALENDAR_WINDOWS_1900) == datetime(1900, 1, 1)
wb = Workbook()
wb.epoch = CALENDAR_MAC_1904
wb.iso_dates = True
value = datetime(2026, 9, 26, 12, 30)
wb.active["A1"] = value
assert wb.active["A1"].value == value
out = BytesIO()
wb.save(out)
with ZipFile(BytesIO(out.getvalue())) as z:
xml = z.read("xl/worksheets/sheet1.xml")
assert b't="d"' in xml and b"2026-09-26T12:30:00" in xml
restored = load_workbook(BytesIO(out.getvalue()))
assert restored.active["A1"].value == value
assert restored.epoch == CALENDAR_MAC_1904
Қабылдау критерийлері және қолмен тексеру шекаралары
| Құбылыстарды бақылаңыз | кіріс немесе шекаралық шарттар | күтілетін нәтиже немесе өңдеу шешімі | Автоматтандыру қолданыла ма |
|---|---|---|---|
| Барлық күндер біркелкі 1462 күнге ауыстырылады | wb.epoch аналитикалық болжамдарға сәйкес келмейді | wb.epoch оқыңыз және реттік нөмірді қайта түрлендіріңіз | иә |
| Деректерде 1900-02-29 көрсетіледі | 60 сериялық нөмірі бар 1900 жүйесі | Жарамсыз күн ретінде белгіленген, 60 бастапқы сериялық нөмірін сақтаңыз | Жоқ, іскери мағынаны қолмен растау керек |
| Уақыттың бір бөлігі жоқ немесе дұрыс емес | tzinfo арқылы datetime енгізіңіз | UTC біркелкі түрлендіріңіз, содан кейін жазу үшін tzinfo файлын алып тастаңыз | бөлігінде мақсатты уақыт белдеуін қолмен анықтау керек |
| Ұяшық нөмірді көрсетеді, бірақ күн ретінде пішімделген | Сан түрі дұрыс, бірақ number_format жоқ | Күн пішімінің маскасын тексеріңіз және толтырыңыз | иә |
| Тарихи күндер (1900-01-01 дейін) әдеттен тыс көрсетіледі | 1900-01-01 ертерек күні | Оның орнына мәтіндік жадты немесе арнайы тарихшы дерекқорды пайдаланыңыз | Жоқ, XLSX бұл сценарий үшін жарамсыз |
Айта кету керек, кодты көрсету тек түрлендіру логикасының дұрыстығын тексереді және ақырғы нәтижеге тең емес. Нақты файлдар бірнеше күн пішімдерін, шартты пішімдерді немесе формулалар арқылы жасалған күндерді қамтуы мүмкін, олар талдаудың қосымша қабаттарын қажет етеді. 1900 жылдың наурызына дейінгі күндерді, уақыт белдеуі арасындағы ынтымақтастық деректерін немесе стандартты емес күнтізбелерді (мысалы, ай күнтізбесі, қаржы жылы) кездестіргенде, қолмен қарап шығу процесін енгізу керек және автоматтандырылған сценарийлер рұқсатсыз түзетулер жасамауы керек.
🎯 Сізге қай әдіс қолайлы?
Экспорттау файлынан күнді оқу қажет болса
Алдымен workbook.epoch оқып шығыңыз, күн жүйесін растаңыз, содан кейін сериялық нөмірді қайта түрлендіруді шешіңіз.
Егер деректеріңіз 1900 жылдың наурызына дейінгі күндерді қамтыса
1900-02-29-ға қатысты жазбаларды жарамсыз деп белгілеп, бастапқы сериялық нөмірді сақтап, іскери мағынаны қолмен растауға тапсырыңыз.
Excel бағдарламасына уақыт белдеуі бар уақытты жазу қажет болса
Алдымен UTC біркелкі түрлендіріңіз, содан кейін tzinfo өшіріңіз; мақсатты уақыт белдеуін қолмен анықтау қажет.
Файлдарды басқа жүйелермен алмастырғыңыз келсе
Күн жүйесін нақты жариялаңыз және қабылдау соңында қайта оқу күнінің мәндерін растаңыз.
❓ Жиі қойылатын сұрақтар (ЖҚС)
1. Неліктен экспортталған күн шамамен төрт жылға ауыстырылды?
Жалпы себеп - жұмыс кітабының күн жүйесінің оқу жағындағы болжамдарға сәйкес келмеуі. 1900 және 1904 жылдардағы екі жүйенің айырмашылығы 1462 күн.
2. iso_dates автоматты түрде дата уақытын жолға айналдыра ма?
Болмайды. iso_dates файлдағы күнді сериялау әдісін ғана басқарады және жадтағы datetime жолға автоматты түрде түрлендірмейді.
3. Неліктен 1900-02-29 Python datetime уақытына түрлендіру мүмкін емес?
1900 Жүйе 1900 жылды кібісе жыл ретінде дұрыс қарастырмайды, бұл Excel бағдарламасында 1900-02-29 болуын тудырады, бірақ бұл күн Григориан күнтізбесінде жоқ. Python datetime ValueError лақтырады, бұл жағдайда бастапқы сандық мән немесе арнайы жалауша журналға жазылуы керек.
4. Excel бағдарламасына уақыт белдеуі бар дата уақытын қалай жазуға болады?
Excel бағдарламасы уақыт белдеулерін сақтауды қолдамайды. Ол алдымен UTC-ге біркелкі түрлендіру керек, содан кейін жазу алдында tzinfo-дан тазартылуы керек; openpyxl уақыт белдеуін түрлендіруді автоматты түрде аяқтамайды.
📝 Түйіндеме
Күнді ауыстыру мәселелері әдетте жұмыс кітабының күндер жүйесінен туындайды. Түрлендіру алдында алдымен workbook.epoch растау көптеген үнсіз қателерді болдырмайды. Шекаралық күн мен уақыт белдеуі мәселелері адам қарауына жіберілу керек.
Анықтамалар және келесі қадамдар
- openpyxl ресми күні мен уақыты құжаттамасы: https://openpyxl.readthedocs.io/en/stable/datetime.html
- Microsoft корпорациясының 1900/1904 күндер жүйесіндегі жазбасы: https://docs.microsoft.com/en-us/office/troubleshoot/excel/1900-and-1904-date-system
- Microsoft корпорациясының 1900 жылғы «кібісе жыл» қатесі туралы түсіндірмесі: https://docs.microsoft.com/en-us/office/troubleshoot/excel/wrongly-assumes-1900-is-leap-year
Келесі қадам: Қолдануға рұқсатыңыз бар десенсибилизацияланған Excel үлгісін таңдаңыз, жоғарыдағы дәуірді анықтау кодын іске қосыңыз және оның күн жүйесінің өңдеу логикасына сәйкес келетінін растаңыз. Сәйкессіздіктер табылса, аударма нәтижелерін жасамас бұрын түрлендіру параметрлерін реттеңіз.
Құжатты аудару үшін осы бақылау тізімін пайдаланыңыз
Алдымен қай мазмұн мәтін, қайсысы формула және бизнес кодтау екенін шешіңіз, содан кейін кестені аударыңыз. Аудармадан кейінгі тексеру қытай тілінің аударылған тілге көшкенін растап қана қоймай, формулалардың, идентификаторлардың және анықтамалық қатынастардың өзгертілмегенін де растайды.
OmniDoc (өнім порталы) көп форматты құжатты аудару порталын ұсынады, ал ресми веб-сайт OCR, глоссарий және екі тілді салыстыру функцияларын ұсынады. Тікелей файлдардан жұмыс істегісі келетін топтар үшін бұл нақты өмір үлгілерімен бағалауға тұрарлық жол. Жүктеп салуға рұқсатыңыз бар сенсибилизацияланған файлдарды пайдаланыңыз және нәтижелерді қарап шығу үшін осы мақаладағы тексеру элементтерін пайдаланыңыз. Бұл мақала OmniDoc мақаладағы ашық бастапқы кітапханаларды немесе ішкі алгоритмдерді пайдаланады деп мәлімдемейді, сондай-ақ өнімнің өнімділігін тексеруді ауыстыру үшін мысалдарды пайдаланбайды.


