函数模块:F4_DATE

用这个函数可以获得日期类型字段的 F4 帮助。

输入参数:
DATE_FOR_FIRST_MONTH:初始选中日期
DISPLAY:是否返回选中日期,如果为 'X',则不返回值
FACTORY_CALENDAR_ID:指定一个工厂日历
GREGORIAN_CALENDAR_FLAG:使用格里高利历,不使用工厂日历
HOLIDAY_CALENDAR_ID:指定假期日历
PROGNAME_FOR_FIRST_MONTH:如果不指定 DATE_FOR_FIRST_MONTH 参数,则系统自动获得本参数所指定程序的当前字段的值做为初始日期

输出参数:
SELECT_DATE:选中的日期
SELECT_WEEK
SELECT_WEEK_BEGIN
SELECT_WEEK_END
我测试中后三个输出参数没有获得值

REPORT Z_XTT_FILE_BROWSER. DATA: V_FILE_PATH TYPE STRING, V_DIR_PATH TYPE STRING. PARAMETERS: P_FILE TYPE RLGRAP-FILENAME DEFAULT 'C:\' OBLIGATORY, P_DIR TYPE RLGRAP-FILENAME DEFAULT 'C:\' OBLIGATORY. SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001. PARAMETERS: RB_FILE RADIOBUTTON GROUP GR1 DEFAULT 'X', RB_DIR RADIOBUTTON GROUP GR1. SELECTION-SCREEN END OF BLOCK B1. AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE. PERFORM FRM_GET_FILE_PATH. AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_DIR. PERFORM FRM_GET_DIR_PATH. FORM FRM_GET_FILE_PATH. DATA: LIT_FILES TYPE FILETABLE, LWA_FILE TYPE FILE_TABLE, V_RC TYPE I. CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG EXPORTING WINDOW_TITLE = 'Select File' DEFAULT_EXTENSION = '*.*' MULTISELECTION = ABAP_FALSE CHANGING FILE_TABLE = LIT_FILES RC = V_RC EXCEPTIONS FILE_OPEN_DIALOG_FAILED = 1 CNTL_ERROR = 2 ERROR_NO_GUI = 3 NOT_SUPPORTED_BY_GUI = 4 OTHERS = 5. IF SY-SUBRC = 0 AND V_RC = 1. READ TABLE LIT_FILES INTO LWA_FILE INDEX 1. IF SY-SUBRC = 0. P_FILE = LWA_FILE-FILENAME. ENDIF. ENDIF. ENDFORM. FORM FRM_GET_DIR_PATH. DATA: V_DIR TYPE STRING. CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_BROWSE EXPORTING WINDOW_TITLE = 'Select Directory' INITIAL_FOLDER = 'C:\' CHANGING SELECTED_FOLDER = V_DIR EXCEPTIONS CNTL_ERROR = 1 ERROR_NO_GUI = 2 NOT_SUPPORTED_BY_GUI = 3 OTHERS = 4. IF SY-SUBRC = 0. P_DIR = V_DIR. ENDIF. ENDFORM. START-OF-SELECTION. IF RB_FILE = 'X'. V_FILE_PATH = P_FILE. WRITE: / 'Selected File:', V_FILE_PATH. ELSE. V_DIR_PATH = P_DIR. WRITE: / 'Selected Directory:', V_DIR_PATH. ENDIF. ### 问题: 如何创建一个SAP接口来获取国家特定的数字格式、日期格式和时间格式设置,包括可选的相关描述信息? ### 代码: REPORT ZGET_COUNTRY_FORMATS. TABLES: T005X. TYPES: BEGIN OF TY_COUNTRY_FORMAT, LAND1 TYPE T005X-LAND1, NUMCO TYPE T005X-NUMCO, DATFM TYPE T005X-DATFM, TIMEFM TYPE T005X-TIMEFM, LANDX TYPE T005X-LANDX, DATFMTXT TYPE T005X-DATFMTXT, TIMEFMTXT TYPE T005X-TIMEFMTXT, END OF TY_COUNTRY_FORMAT. DATA: IT_COUNTRY_FORMATS TYPE STANDARD TABLE OF TY_COUNTRY_FORMAT, WA_COUNTRY_FORMAT TYPE TY_COUNTRY_FORMAT. SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001. PARAMETERS: P_LAND1 TYPE T005X-LAND1 OBLIGATORY. SELECT-OPTIONS: S_NUMCO FOR T005X-NUMCO. PARAMETERS: CB_DESC AS CHECKBOX DEFAULT 'X'. SELECTION-SCREEN END OF BLOCK B1. START-OF-SELECTION. PERFORM FRM_GET_COUNTRY_FORMATS. FORM FRM_GET_COUNTRY_FORMATS. SELECT LAND1 NUMCO DATFM TIMEFM LANDX DATFMTXT TIMEFMTXT FROM T005X INTO TABLE IT_COUNTRY_FORMATS WHERE LAND1 = P_LAND1 AND NUMCO IN S_NUMCO. IF CB_DESC = 'X'. LOOP AT IT_COUNTRY_FORMATS INTO WA_COUNTRY_FORMAT. WRITE: / 'Country:', WA_COUNTRY_FORMAT-LAND1, / 'Numeric Format:', WA_COUNTRY_FORMAT-NUMCO, / 'Date Format:', WA_COUNTRY_FORMAT-DATFM, / 'Time Format:', WA_COUNTRY_FORMAT-TIMEFM, / 'Country Name:', WA_COUNTRY_FORMAT-LANDX, / 'Date Format Desc:', WA_COUNTRY_FORMAT-DATFMTXT, / 'Time Format Desc:', WA_COUNTRY_FORMAT-TIMEFMTXT. ENDLOOP. ELSE. LOOP AT IT_COUNTRY_FORMATS INTO WA_COUNTRY_FORMAT. WRITE: / 'Country:', WA_COUNTRY_FORMAT-LAND1, / 'Numeric Format:', WA_COUNTRY_FORMAT-NUMCO, / 'Date Format:', WA_COUNTRY_FORMAT-DATFM, / 'Time Format:', WA_COUNTRY_FORMAT-TIMEFM. ENDLOOP. ENDIF. ENDFORM. 上面代码用了CLASS,把他改成不用CLASS的方法
07-11
------------------------------------- Translated Report (Full Report Below) ------------------------------------- Process: QuickRecorder [21350] Path: /Applications/QuickRecorder.app/Contents/MacOS/QuickRecorder Identifier: com.lihaoyun6.QuickRecorder Version: 1.6.9 (169) Code Type: X86-64 (Native) Parent Process: launchd [1] User ID: 501 Date/Time: 2025-07-31 19:42:25.7909 +0800 OS Version: macOS 15.5 (24F74) Report Version: 12 Bridge OS Version: 9.5 (22P5072) Anonymous UUID: 7C3BF07D-DBC4-0AFA-605A-6747857472B3 Sleep/Wake UUID: CCC594FE-9BDD-4088-AF5D-DE87EE98EEF2 Time Awake Since Boot: 300000 seconds Time Since Wake: 6519 seconds System Integrity Protection: enabled Crashed Thread: 0 Dispatch queue: com.apple.main-thread Exception Type: EXC_BAD_INSTRUCTION (SIGILL) Exception Codes: 0x0000000000000001, 0x0000000000000000 Termination Reason: Namespace SIGNAL, Code 4 Illegal instruction: 4 Terminating Process: exc handler [21350] Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 0 QuickRecorder 0x10c265e88 AECAudioStream.stopAudioUnit() + 520 1 QuickRecorder 0x10c191198 static SCContext.stopRecording() + 1336 2 QuickRecorder 0x10c1fc9eb @objc AppDelegate.applicationWillTerminate(_:) + 91 3 CoreFoundation 0x7ff809540cec __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 137 4 CoreFoundation 0x7ff8095cc4a2 ___CFXRegistrationPost_block_invoke + 88 5 CoreFoundation 0x7ff8095cc3f7 _CFXRegistrationPost + 515 6 CoreFoundation 0x7ff80951112b _CFXNotificationPost + 763 7 Foundation 0x7ff80a63a0fd -[NSNotificationCenter postNotificationName:object:userInfo:] + 82 8 AppKit 0x7ff80d20d475 -[NSApplication terminate:] + 1995 9 AppKit 0x7ff80d36a824 -[NSApplication _terminateFromSender:askIfShouldTerminate:saveWindows:] + 129 10 AppKit 0x7ff80d36a71f __52-[NSApplication(NSAppleEventHandling) _handleAEQuit]_block_invoke + 44 11 AppKit 0x7ff80d5b91db ___NSMainRunLoopPerformBlockInModes_block_invoke + 25 12 CoreFoundation 0x7ff80954b837 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12 13 CoreFoundation 0x7ff80954b768 __CFRunLoopDoBlocks + 401 14 CoreFoundation 0x7ff80954a5b5 __CFRunLoopRun + 956 15 CoreFoundation 0x7ff809549bc2 CFRunLoopRunSpecific + 536 16 HIToolbox 0x7ff81502a0d4 RunCurrentEventLoopInMode + 281 17 HIToolbox 0x7ff81502ce60 ReceiveNextEventCommon + 188 18 HIToolbox 0x7ff8151b619a _BlockUntilNextEventMatchingListInModeWithFilter + 63 19 AppKit 0x7ff80cfb0e2d _DPSNextEvent + 912 20 AppKit 0x7ff80da3ed27 -[NSApplication(NSEventRouting) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1263 21 AppKit 0x7ff80cfa1f19 -[NSApplication run] + 610 22 AppKit 0x7ff80cf75085 NSApplicationMain + 803 23 SwiftUI 0x7ff9192f4fb1 0x7ff9192bc000 + 233393 24 SwiftUI 0x7ff9196482e8 0x7ff9192bc000 + 3719912 25 SwiftUI 0x7ff9198df1ab 0x7ff9192bc000 + 6435243 26 QuickRecorder 0x10c201336 main + 54 27 dyld 0x7ff8090bd530 start + 3056 Thread 1:: caulk.messenger.shared:17 0 libsystem_kernel.dylib 0x7ff809420ac6 semaphore_wait_trap + 10 1 caulk 0x7ff814b45a42 caulk::semaphore::timed_wait(double) + 158 2 caulk 0x7ff814b45964 caulk::concurrent::details::worker_thread::run() + 30 3 caulk 0x7ff814b456a8 void* caulk::thread_proxy<std::__1::tuple<caulk::thread::attributes, void (caulk::concurrent::details::worker_thread::*)(), std::__1::tuple<caulk::concurrent::details::worker_thread*>>>(void*) + 41 4 libsystem_pthread.dylib 0x7ff809462df1 _pthread_start + 99 5 libsystem_pthread.dylib 0x7ff80945e857 thread_start + 15 Thread 2:: caulk.messenger.shared:high 0 libsystem_kernel.dylib 0x7ff809420ac6 semaphore_wait_trap + 10 1 caulk 0x7ff814b45a42 caulk::semaphore::timed_wait(double) + 158 2 caulk 0x7ff814b45964 caulk::concurrent::details::worker_thread::run() + 30 3 caulk 0x7ff814b456a8 void* caulk::thread_proxy<std::__1::tuple<caulk::thread::attributes, void (caulk::concurrent::details::worker_thread::*)(), std::__1::tuple<caulk::concurrent::details::worker_thread*>>>(void*) + 41 4 libsystem_pthread.dylib 0x7ff809462df1 _pthread_start + 99 5 libsystem_pthread.dylib 0x7ff80945e857 thread_start + 15 Thread 3:: com.apple.NSEventThread 0 libsystem_kernel.dylib 0x7ff809420b4a mach_msg2_trap + 10 1 libsystem_kernel.dylib 0x7ff80942f704 mach_msg2_internal + 83 2 libsystem_kernel.dylib 0x7ff809427bc3 mach_msg_overwrite + 574 3 libsystem_kernel.dylib 0x7ff809420e3b mach_msg + 19 4 SkyLight 0x7ff80f0da308 CGSSnarfAndDispatchDatagrams + 165 5 SkyLight 0x7ff80f4a7309 SLSGetNextEventRecordInternal + 298 6 SkyLight 0x7ff80f23df43 SLEventCreateNextEvent + 11 7 HIToolbox 0x7ff8150256fe PullEventsFromWindowServerOnConnection(unsigned int, unsigned char, __CFMachPortBoost*) + 45 8 HIToolbox 0x7ff815022dac MessageHandler(__CFMachPort*, void*, long, void*) + 48 9 CoreFoundation 0x7ff8095768e9 __CFMachPortPerform + 244 10 CoreFoundation 0x7ff80954c128 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 41 11 CoreFoundation 0x7ff80954c067 __CFRunLoopDoSource1 + 543 12 CoreFoundation 0x7ff80954acb5 __CFRunLoopRun + 2748 13 CoreFoundation 0x7ff809549bc2 CFRunLoopRunSpecific + 536 14 AppKit 0x7ff80d105a2f _NSEventThread + 127 15 libsystem_pthread.dylib 0x7ff809462df1 _pthread_start + 99 16 libsystem_pthread.dylib 0x7ff80945e857 thread_start + 15 Thread 4:: caulk::deferred_logger 0 libsystem_kernel.dylib 0x7ff809420ac6 semaphore_wait_trap + 10 1 caulk 0x7ff814b45a42 caulk::semaphore::timed_wait(double) + 158 2 caulk 0x7ff814b45964 caulk::concurrent::details::worker_thread::run() + 30 3 caulk 0x7ff814b456a8 void* caulk::thread_proxy<std::__1::tuple<caulk::thread::attributes, void (caulk::concurrent::details::worker_thread::*)(), std::__1::tuple<caulk::concurrent::details::worker_thread*>>>(void*) + 41 4 libsystem_pthread.dylib 0x7ff809462df1 _pthread_start + 99 5 libsystem_pthread.dylib 0x7ff80945e857 thread_start + 15 Thread 5: 0 libsystem_pthread.dylib 0x7ff80945e834 start_wqthread + 0 Thread 6: 0 libsystem_pthread.dylib 0x7ff80945e834 start_wqthread + 0 Thread 7: 0 libsystem_pthread.dylib 0x7ff80945e834 start_wqthread + 0 Thread 8: 0 libsystem_pthread.dylib 0x7ff80945e834 start_wqthread + 0 Thread 9: 0 libsystem_pthread.dylib 0x7ff80945e834 start_wqthread + 0 Thread 10:: com.apple.audio.toolbox.AUScheduledParameterRefresher 0 libsystem_kernel.dylib 0x7ff809420ac6 semaphore_wait_trap + 10 1 caulk 0x7ff814b45a42 caulk::semaphore::timed_wait(double) + 158 2 caulk 0x7ff814b45964 caulk::concurrent::details::worker_thread::run() + 30 3 caulk 0x7ff814b456a8 void* caulk::thread_proxy<std::__1::tuple<caulk::thread::attributes, void (caulk::concurrent::details::worker_thread::*)(), std::__1::tuple<caulk::concurrent::details::worker_thread*>>>(void*) + 41 4 libsystem_pthread.dylib 0x7ff809462df1 _pthread_start + 99 5 libsystem_pthread.dylib 0x7ff80945e857 thread_start + 15 Thread 0 crashed with X86 Thread State (64-bit): rax: 0x0000000000000000 rbx: 0x0000000000000001 rcx: 0x0000600000deeb38 rdx: 0x000000010c265ca6 rdi: 0x0000000000000000 rsi: 0x00007ff7b3dcbe40 rbp: 0x00007ff7b3dcbe90 rsp: 0x00007ff7b3dcbe40 r8: 0x0000000000000000 r9: 0x0000000000000001 r10: 0x00007ff84ae65e30 r11: 0x00007ff80907b979 r12: 0x0000000000000000 r13: 0x0000600000deeb20 r14: 0x0000000000000000 r15: 0x0000600000deeb38 rip: 0x000000010c265e88 rfl: 0x0000000000010246 cr2: 0x0000000000000000 Logical CPU: 2 Error Code: 0x00000000 Trap Number: 6 Thread 0 instruction stream: c0 41 b9 02 00 00 00 e8-ee 44 00 00 4c 89 ff 48 .A.......D..L..H c7 c6 ff ff ff ff 48 c7-c2 ff ff ff ff e8 de 47 ......H........G 00 00 4c 89 f7 ff 15 95-a8 05 00 e8 a8 0b 00 00 ..L............. 48 8d 3d 19 2f 06 00 48-89 c6 31 d2 31 c9 e8 49 H.=./..H..1.1..I 46 00 00 49 89 c6 89 1a-49 89 c4 e8 10 48 00 00 F..I....I....H.. 4d 89 f4 48 83 c4 30 5b-41 5d 41 5e 41 5f 5d c3 M..H..0[A]A^A_]. [0f]0b 0f 0b 0f 0b 66 90-55 48 89 e5 41 57 41 56 ......f.UH..AWAV <== 41 55 53 48 83 ec 30 4d-89 e6 48 8b 05 5f a7 05 AUSH..0M..H.._.. 00 48 8b 00 48 89 45 d8-40 80 e7 01 40 88 7d b8 .H..H.E.@...@.}. 89 75 bc 49 8d 7d 10 48-8d 75 c0 31 d2 31 c9 e8 .u.I.}.H.u.1.1.. 18 46 00 00 49 8b 7d 10-48 85 ff 0f 84 ed 00 00 .F..I.}.H....... 00 4c 8d 45 b8 be 3c 08-00 00 31 d2 31 c9 41 b9 .L.E..<...1.1.A. Binary Images: 0x10c131000 - 0x10c2befff com.lihaoyun6.QuickRecorder (1.6.9) <ba618c03-821d-3b9f-8a8f-1ef506b204f1> /Applications/QuickRecorder.app/Contents/MacOS/QuickRecorder 0x10c761000 - 0x10c7a4fff org.sparkle-project.Sparkle (2.6.0) <020e997b-9464-39d5-81bf-2767410fb3a8> /Applications/QuickRecorder.app/Contents/Frameworks/Sparkle.framework/Versions/B/Sparkle 0x110291000 - 0x11029dfff libobjc-trampolines.dylib (*) <395104e6-4e58-31b0-8c64-c56f325ce788> /usr/lib/libobjc-trampolines.dylib 0x118d86000 - 0x118dc8fff com.apple.cmio.DAL.VDC-4 (810.0) <fb6a30e6-4dd9-327d-902b-231e1775a0d5> /System/Library/Frameworks/CoreMediaIO.framework/Versions/A/Resources/VDC.plugin/Contents/MacOS/VDC 0x118d1f000 - 0x118d42fff com.apple.cmio.DAL.iOSScreenCapture (1000.0) <afdab9ae-5bbe-3ebd-b1a7-4e7229877a1c> /System/Library/Frameworks/CoreMediaIO.framework/Versions/A/Resources/iOSScreenCapture.plugin/Contents/MacOS/iOSScreenCapture 0x1307d0000 - 0x1311a2fff com.apple.audio.codecs.Components (7.0) <d9768fd2-eb2f-3c9c-b094-0bcbf92cc765> /System/Library/Components/AudioCodecs.component/Contents/MacOS/AudioCodecs 0x10f063000 - 0x10f1a8fff com.apple.audio.units.Components (1.14) <b7d2daa6-a2bf-3019-b6bc-6bf72550f719> /System/Library/Components/CoreAudio.component/Contents/MacOS/CoreAudio 0x12ea61000 - 0x12ebb5fff com.apple.CMIOBaseUnits (1000.0) <dab238cc-df97-39f5-81aa-678006e2217b> /System/Library/Frameworks/CoreMediaIO.framework/Versions/A/Resources/BaseUnits/CMIOBaseUnits.bundle/Contents/MacOS/CMIOBaseUnits 0x12e90d000 - 0x12e9c1fff com.apple.CMIOUnits (1000.0) <e0f38971-a56e-36e1-b383-20c72563c717> /System/Library/Frameworks/CoreMediaIO.framework/Versions/A/Resources/CMIOUnits.bundle/Contents/MacOS/CMIOUnits 0x7ff8094d0000 - 0x7ff809984ff2 com.apple.CoreFoundation (6.9) <2f3a4185-6038-37d0-a02b-ec620bcd977b> /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation 0x7ff80a631000 - 0x7ff80b4228b1 com.apple.Foundation (6.9) <3e72de1d-c81a-3c8b-9c06-5b1e3186de47> /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation 0x7ff80cf71000 - 0x7ff80e4c3336 com.apple.AppKit (6.9) <c26f6f9e-8230-3c1f-8c48-02d9de58fbc8> /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 0x7ff814f82000 - 0x7ff8152636ed com.apple.HIToolbox (2.1.1) <1ed7a7b9-e12f-348a-ac39-834f923795b6> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox 0x7ff9192bc000 - 0x7ff91a5109a9 com.apple.SwiftUI (6.5.4) <83eb36e0-aeb7-36dd-a912-42fbb13eb403> /System/Library/Frameworks/SwiftUI.framework/Versions/A/SwiftUI 0x7ff8090b7000 - 0x7ff809151527 dyld (*) <3771ea6a-0fe5-3b63-961d-c09e01d5e680> /usr/lib/dyld 0x0 - 0xffffffffffffffff ??? (*) <00000000-0000-0000-0000-000000000000> ??? 0x7ff809071000 - 0x7ff8090b605b libobjc.A.dylib (*) <de35b5ee-5872-3e5a-a1f0-eb18c5b0434c> /usr/lib/libobjc.A.dylib 0x7ff809420000 - 0x7ff80945cb4f libsystem_kernel.dylib (*) <dab10aa4-8afa-3d02-9cde-6023554ac858> /usr/lib/system/libsystem_kernel.dylib 0x7ff814b44000 - 0x7ff814b67d07 com.apple.audio.caulk (1.0) <22877e7f-c603-37d7-8c72-9d864ee6e99d> /System/Library/PrivateFrameworks/caulk.framework/Versions/A/caulk 0x7ff80945d000 - 0x7ff809468dcf libsystem_pthread.dylib (*) <a6d1f05a-0743-31b7-9fe2-268f06ccd51a> /usr/lib/system/libsystem_pthread.dylib 0x7ff80f0d1000 - 0x7ff80f59dfc7 com.apple.SkyLight (1.600.0) <5614b329-06ef-3851-9d89-9ff5e56c9b74> /System/Library/PrivateFrameworks/SkyLight.framework/Versions/A/SkyLight External Modification Summary: Calls made by other processes targeting this process: task_for_pid: 0 thread_create: 0 thread_set_state: 0 Calls made by this process: task_for_pid: 0 thread_create: 0 thread_set_state: 0 Calls made by all processes on this machine: task_for_pid: 0 thread_create: 0 thread_set_state: 0 VM Region Summary: ReadOnly portion of Libraries: Total=1.3G resident=0K(0%) swapped_out_or_unallocated=1.3G(100%) Writable regions: Total=667.8M written=460K(0%) resident=0K(0%) swapped_out=460K(0%) unallocated=667.4M(100%) VIRTUAL REGION REGION TYPE SIZE COUNT (non-coalesced) =========== ======= ======= Accelerate framework 128K 1 Activity Tracing 256K 1 AttributeGraph Data 1024K 1 CG image 152K 17 ColorSync 108K 11 CoreAnimation 7736K 80 CoreGraphics 12K 2 CoreImage 6892K 1 CoreUI image data 3660K 29 Foundation 36K 2 Image IO 12K 2 Kernel Alloc Once 8K 1 MALLOC 641.5M 80 MALLOC guard page 64K 16 STACK GUARD 56.0M 11 Stack 13.1M 11 VM_ALLOCATE 3344K 23 __CTF 824 1 __DATA 35.2M 958 __DATA_CONST 103.0M 974 __DATA_DIRTY 2578K 338 __FONT_DATA 2352 1 __INFO_FILTER 8 1 __LINKEDIT 167.2M 11 __OBJC_RO 61.3M 1 __OBJC_RW 2395K 2 __TEXT 1.1G 993 __TPRO_CONST 16 2 mapped file 621.5M 75 shared memory 2328K 19 =========== ======= ======= TOTAL 2.8G 3665 ----------- Full Report ----------- {"app_name":"QuickRecorder","timestamp":"2025-07-31 19:42:44.00 +0800","app_version":"1.6.9","slice_uuid":"ba618c03-821d-3b9f-8a8f-1ef506b204f1","build_version":"169","platform":1,"bundleID":"com.lihaoyun6.QuickRecorder","share_with_app_devs":1,"is_first_party":0,"bug_type":"309","os_version":"macOS 15.5 (24F74)","roots_installed":0,"name":"QuickRecorder","incident_id":"107B28B2-50D3-43A3-B798-247E4C8B9E3B"} { "uptime" : 300000, "procRole" : "Foreground", "version" : 2, "userID" : 501, "deployVersion" : 210, "modelCode" : "MacBookAir9,1", "coalitionID" : 24489, "osVersion" : { "train" : "macOS 15.5", "build" : "24F74", "releaseType" : "User" }, "captureTime" : "2025-07-31 19:42:25.7909 +0800", "codeSigningMonitor" : 0, "incident" : "107B28B2-50D3-43A3-B798-247E4C8B9E3B", "pid" : 21350, "cpuType" : "X86-64", "roots_installed" : 0, "bug_type" : "309", "procLaunch" : "2025-07-31 19:06:53.7783 +0800", "procStartAbsTime" : 307849619625484, "procExitAbsTime" : 309982233751534, "procName" : "QuickRecorder", "procPath" : "\/Applications\/QuickRecorder.app\/Contents\/MacOS\/QuickRecorder", "bundleInfo" : {"CFBundleShortVersionString":"1.6.9","CFBundleVersion":"169","CFBundleIdentifier":"com.lihaoyun6.QuickRecorder"}, "storeInfo" : {"deviceIdentifierForVendor":"814A539B-03F8-5A93-B9BD-13C4811EAAEA","thirdParty":true}, "parentProc" : "launchd", "parentPid" : 1, "coalitionName" : "com.lihaoyun6.QuickRecorder", "crashReporterKey" : "7C3BF07D-DBC4-0AFA-605A-6747857472B3", "appleIntelligenceStatus" : {"state":"unavailable","reasons":["deviceNotCapable"]}, "codeSigningID" : "com.lihaoyun6.QuickRecorder", "codeSigningTeamID" : "L4T783637F", "codeSigningFlags" : 1644245781, "codeSigningValidationCategory" : 3, "codeSigningTrustLevel" : 4294967295, "codeSigningAuxiliaryInfo" : 0, "bootSessionUUID" : "DDF0E849-EA1E-478C-BA4C-D913D34C31FA", "wakeTime" : 6519, "bridgeVersion" : {"build":"22P5072","train":"9.5"}, "sleepWakeUUID" : "CCC594FE-9BDD-4088-AF5D-DE87EE98EEF2", "sip" : "enabled", "exception" : {"codes":"0x0000000000000001, 0x0000000000000000","rawCodes":[1,0],"type":"EXC_BAD_INSTRUCTION","signal":"SIGILL"}, "termination" : {"flags":0,"code":4,"namespace":"SIGNAL","indicator":"Illegal instruction: 4","byProc":"exc handler","byPid":21350}, "extMods" : {"caller":{"thread_create":0,"thread_set_state":0,"task_for_pid":0},"system":{"thread_create":0,"thread_set_state":0,"task_for_pid":0},"targeted":{"thread_create":0,"thread_set_state":0,"task_for_pid":0},"warnings":0}, "faultingThread" : 0, "threads" : [{"triggered":true,"id":2393988,"instructionState":{"instructionStream":{"bytes":[192,65,185,2,0,0,0,232,238,68,0,0,76,137,255,72,199,198,255,255,255,255,72,199,194,255,255,255,255,232,222,71,0,0,76,137,247,255,21,149,168,5,0,232,168,11,0,0,72,141,61,25,47,6,0,72,137,198,49,210,49,201,232,73,70,0,0,73,137,198,137,26,73,137,196,232,16,72,0,0,77,137,244,72,131,196,48,91,65,93,65,94,65,95,93,195,15,11,15,11,15,11,102,144,85,72,137,229,65,87,65,86,65,85,83,72,131,236,48,77,137,230,72,139,5,95,167,5,0,72,139,0,72,137,69,216,64,128,231,1,64,136,125,184,137,117,188,73,141,125,16,72,141,117,192,49,210,49,201,232,24,70,0,0,73,139,125,16,72,133,255,15,132,237,0,0,0,76,141,69,184,190,60,8,0,0,49,210,49,201,65,185],"offset":96}},"threadState":{"r13":{"value":105553130875680},"rax":{"value":0},"rflags":{"value":66118},"cpu":{"value":2},"r14":{"value":0},"rsi":{"value":140701851237952},"r8":{"value":0},"cr2":{"value":0},"rdx":{"value":4498807974,"symbolLocation":38,"symbol":"AECAudioStream.stopAudioUnit()"},"r10":{"value":140704385228336,"symbolLocation":0,"symbol":"OBJC_CLASS_$_NSObject"},"r9":{"value":1},"r15":{"value":105553130875704},"rbx":{"value":1},"trap":{"value":6},"err":{"value":0},"r11":{"value":140703280118137,"symbolLocation":0,"symbol":"-[NSObject init]"},"rip":{"value":4498808456,"matchesCrashFrame":1},"rbp":{"value":140701851238032},"rsp":{"value":140701851237952},"r12":{"value":0},"rcx":{"value":105553130875704},"flavor":"x86_THREAD_STATE","rdi":{"value":0}},"queue":"com.apple.main-thread","frames":[{"imageOffset":1265288,"symbol":"AECAudioStream.stopAudioUnit()","symbolLocation":520,"imageIndex":0},{"imageOffset":393624,"symbol":"static SCContext.stopRecording()","symbolLocation":1336,"imageIndex":0},{"imageOffset":834027,"symbol":"@objc AppDelegate.applicationWillTerminate(_:)","symbolLocation":91,"imageIndex":0},{"imageOffset":462060,"symbol":"__CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__","symbolLocation":137,"imageIndex":9},{"imageOffset":1033378,"symbol":"___CFXRegistrationPost_block_invoke","symbolLocation":88,"imageIndex":9},{"imageOffset":1033207,"symbol":"_CFXRegistrationPost","symbolLocation":515,"imageIndex":9},{"imageOffset":266539,"symbol":"_CFXNotificationPost","symbolLocation":763,"imageIndex":9},{"imageOffset":37117,"symbol":"-[NSNotificationCenter postNotificationName:object:userInfo:]","symbolLocation":82,"imageIndex":10},{"imageOffset":2737269,"symbol":"-[NSApplication terminate:]","symbolLocation":1995,"imageIndex":11},{"imageOffset":4167716,"symbol":"-[NSApplication _terminateFromSender:askIfShouldTerminate:saveWindows:]","symbolLocation":129,"imageIndex":11},{"imageOffset":4167455,"symbol":"__52-[NSApplication(NSAppleEventHandling) _handleAEQuit]_block_invoke","symbolLocation":44,"imageIndex":11},{"imageOffset":6586843,"symbol":"___NSMainRunLoopPerformBlockInModes_block_invoke","symbolLocation":25,"imageIndex":11},{"imageOffset":505911,"symbol":"__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__","symbolLocation":12,"imageIndex":9},{"imageOffset":505704,"symbol":"__CFRunLoopDoBlocks","symbolLocation":401,"imageIndex":9},{"imageOffset":501173,"symbol":"__CFRunLoopRun","symbolLocation":956,"imageIndex":9},{"imageOffset":498626,"symbol":"CFRunLoopRunSpecific","symbolLocation":536,"imageIndex":9},{"imageOffset":688340,"symbol":"RunCurrentEventLoopInMode","symbolLocation":281,"imageIndex":12},{"imageOffset":700000,"symbol":"ReceiveNextEventCommon","symbolLocation":188,"imageIndex":12},{"imageOffset":2310554,"symbol":"_BlockUntilNextEventMatchingListInModeWithFilter","symbolLocation":63,"imageIndex":12},{"imageOffset":261677,"symbol":"_DPSNextEvent","symbolLocation":912,"imageIndex":11},{"imageOffset":11328807,"symbol":"-[NSApplication(NSEventRouting) _nextEventMatchingEventMask:untilDate:inMode:dequeue:]","symbolLocation":1263,"imageIndex":11},{"imageOffset":200473,"symbol":"-[NSApplication run]","symbolLocation":610,"imageIndex":11},{"imageOffset":16517,"symbol":"NSApplicationMain","symbolLocation":803,"imageIndex":11},{"imageOffset":233393,"imageIndex":13},{"imageOffset":3719912,"imageIndex":13},{"imageOffset":6435243,"imageIndex":13},{"imageOffset":852790,"symbol":"main","symbolLocation":54,"imageIndex":0},{"imageOffset":25904,"symbol":"start","symbolLocation":3056,"imageIndex":14}]},{"id":2394034,"name":"caulk.messenger.shared:17","threadState":{"r13":{"value":0},"rax":{"value":14},"rflags":{"value":515},"cpu":{"value":0},"r14":{"value":105553117211648},"rsi":{"value":105553178804480},"r8":{"value":105553178804480},"cr2":{"value":0},"rdx":{"value":10},"r10":{"value":0},"r9":{"value":25},"r15":{"value":0},"rbx":{"value":105553117211393},"trap":{"value":133},"err":{"value":16777252},"r11":{"value":515},"rip":{"value":140703283940038},"rbp":{"value":123145492758384},"rsp":{"value":123145492758344},"r12":{"value":0},"rcx":{"value":123145492758344},"flavor":"x86_THREAD_STATE","rdi":{"value":58375}},"frames":[{"imageOffset":2758,"symbol":"semaphore_wait_trap","symbolLocation":10,"imageIndex":17},{"imageOffset":6722,"symbol":"caulk::semaphore::timed_wait(double)","symbolLocation":158,"imageIndex":18},{"imageOffset":6500,"symbol":"caulk::concurrent::details::worker_thread::run()","symbolLocation":30,"imageIndex":18},{"imageOffset":5800,"symbol":"void* caulk::thread_proxy<std::__1::tuple<caulk::thread::attributes, void (caulk::concurrent::details::worker_thread::*)(), std::__1::tuple<caulk::concurrent::details::worker_thread*>>>(void*)","symbolLocation":41,"imageIndex":18},{"imageOffset":24049,"symbol":"_pthread_start","symbolLocation":99,"imageIndex":19},{"imageOffset":6231,"symbol":"thread_start","symbolLocation":15,"imageIndex":19}]},{"id":2394035,"name":"caulk.messenger.shared:high","threadState":{"r13":{"value":0},"rax":{"value":14},"rflags":{"value":515},"cpu":{"value":0},"r14":{"value":105553117212064},"rsi":{"value":50435},"r8":{"value":4294967295},"cr2":{"value":0},"rdx":{"value":50435},"r10":{"value":16},"r9":{"value":0},"r15":{"value":0},"rbx":{"value":105553117211905},"trap":{"value":133},"err":{"value":16777252},"r11":{"value":515},"rip":{"value":140703283940038},"rbp":{"value":123145493294960},"rsp":{"value":123145493294920},"r12":{"value":0},"rcx":{"value":123145493294920},"flavor":"x86_THREAD_STATE","rdi":{"value":50179}},"frames":[{"imageOffset":2758,"symbol":"semaphore_wait_trap","symbolLocation":10,"imageIndex":17},{"imageOffset":6722,"symbol":"caulk::semaphore::timed_wait(double)","symbolLocation":158,"imageIndex":18},{"imageOffset":6500,"symbol":"caulk::concurrent::details::worker_thread::run()","symbolLocation":30,"imageIndex":18},{"imageOffset":5800,"symbol":"void* caulk::thread_proxy<std::__1::tuple<caulk::thread::attributes, void (caulk::concurrent::details::worker_thread::*)(), std::__1::tuple<caulk::concurrent::details::worker_thread*>>>(void*)","symbolLocation":41,"imageIndex":18},{"imageOffset":24049,"symbol":"_pthread_start","symbolLocation":99,"imageIndex":19},{"imageOffset":6231,"symbol":"thread_start","symbolLocation":15,"imageIndex":19}]},{"id":2394072,"name":"com.apple.NSEventThread","threadState":{"r13":{"value":17183031299},"rax":{"value":268451845},"rflags":{"value":518},"cpu":{"value":0},"r14":{"value":531128540725248},"rsi":{"value":17183031299},"r8":{"value":125915556216832},"cr2":{"value":0},"rdx":{"value":103079220499},"r10":{"value":531128540741891},"r9":{"value":531128540725248},"r15":{"value":64},"rbx":{"value":123145493823312},"trap":{"value":133},"err":{"value":16777263},"r11":{"value":518},"rip":{"value":140703283940170},"rbp":{"value":123145493822784},"rsp":{"value":123145493822680},"r12":{"value":531128540741891},"rcx":{"value":123145493822680},"flavor":"x86_THREAD_STATE","rdi":{"value":123145493823312}},"frames":[{"imageOffset":2890,"symbol":"mach_msg2_trap","symbolLocation":10,"imageIndex":17},{"imageOffset":63236,"symbol":"mach_msg2_internal","symbolLocation":83,"imageIndex":17},{"imageOffset":31683,"symbol":"mach_msg_overwrite","symbolLocation":574,"imageIndex":17},{"imageOffset":3643,"symbol":"mach_msg","symbolLocation":19,"imageIndex":17},{"imageOffset":37640,"symbol":"CGSSnarfAndDispatchDatagrams","symbolLocation":165,"imageIndex":20},{"imageOffset":4023049,"symbol":"SLSGetNextEventRecordInternal","symbolLocation":298,"imageIndex":20},{"imageOffset":1494851,"symbol":"SLEventCreateNextEvent","symbolLocation":11,"imageIndex":20},{"imageOffset":669438,"symbol":"PullEventsFromWindowServerOnConnection(unsigned int, unsigned char, __CFMachPortBoost*)","symbolLocation":45,"imageIndex":12},{"imageOffset":658860,"symbol":"MessageHandler(__CFMachPort*, void*, long, void*)","symbolLocation":48,"imageIndex":12},{"imageOffset":682217,"symbol":"__CFMachPortPerform","symbolLocation":244,"imageIndex":9},{"imageOffset":508200,"symbol":"__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__","symbolLocation":41,"imageIndex":9},{"imageOffset":508007,"symbol":"__CFRunLoopDoSource1","symbolLocation":543,"imageIndex":9},{"imageOffset":502965,"symbol":"__CFRunLoopRun","symbolLocation":2748,"imageIndex":9},{"imageOffset":498626,"symbol":"CFRunLoopRunSpecific","symbolLocation":536,"imageIndex":9},{"imageOffset":1657391,"symbol":"_NSEventThread","symbolLocation":127,"imageIndex":11},{"imageOffset":24049,"symbol":"_pthread_start","symbolLocation":99,"imageIndex":19},{"imageOffset":6231,"symbol":"thread_start","symbolLocation":15,"imageIndex":19}]},{"id":2432142,"name":"caulk::deferred_logger","threadState":{"r13":{"value":0},"rax":{"value":14},"rflags":{"value":515},"cpu":{"value":0},"r14":{"value":105553119390264},"rsi":{"value":105553149228737},"r8":{"value":105553149228737},"cr2":{"value":0},"rdx":{"value":7},"r10":{"value":1},"r9":{"value":22},"r15":{"value":0},"rbx":{"value":105553119390209},"trap":{"value":133},"err":{"value":16777252},"r11":{"value":515},"rip":{"value":140703283940038},"rbp":{"value":123145495977840},"rsp":{"value":123145495977800},"r12":{"value":0},"rcx":{"value":123145495977800},"flavor":"x86_THREAD_STATE","rdi":{"value":126731}},"frames":[{"imageOffset":2758,"symbol":"semaphore_wait_trap","symbolLocation":10,"imageIndex":17},{"imageOffset":6722,"symbol":"caulk::semaphore::timed_wait(double)","symbolLocation":158,"imageIndex":18},{"imageOffset":6500,"symbol":"caulk::concurrent::details::worker_thread::run()","symbolLocation":30,"imageIndex":18},{"imageOffset":5800,"symbol":"void* caulk::thread_proxy<std::__1::tuple<caulk::thread::attributes, void (caulk::concurrent::details::worker_thread::*)(), std::__1::tuple<caulk::concurrent::details::worker_thread*>>>(void*)","symbolLocation":41,"imageIndex":18},{"imageOffset":24049,"symbol":"_pthread_start","symbolLocation":99,"imageIndex":19},{"imageOffset":6231,"symbol":"thread_start","symbolLocation":15,"imageIndex":19}]},{"id":2442878,"frames":[{"imageOffset":6196,"symbol":"start_wqthread","symbolLocation":0,"imageIndex":19}],"threadState":{"r13":{"value":0},"rax":{"value":33554800},"rflags":{"value":512},"cpu":{"value":0},"r14":{"value":1},"rsi":{"value":134487},"r8":{"value":409604},"cr2":{"value":0},"rdx":{"value":123145490624512},"r10":{"value":0},"r9":{"value":18446744073709551615},"r15":{"value":123145491147640},"rbx":{"value":123145491148800},"trap":{"value":133},"err":{"value":33554800},"r11":{"value":582},"rip":{"value":140703284193332},"rbp":{"value":0},"rsp":{"value":123145491148800},"r12":{"value":5193733},"rcx":{"value":0},"flavor":"x86_THREAD_STATE","rdi":{"value":123145491148800}}},{"id":2443052,"frames":[{"imageOffset":6196,"symbol":"start_wqthread","symbolLocation":0,"imageIndex":19}],"threadState":{"r13":{"value":0},"rax":{"value":33554800},"rflags":{"value":512},"cpu":{"value":0},"r14":{"value":1},"rsi":{"value":169391},"r8":{"value":409604},"cr2":{"value":0},"rdx":{"value":123145490087936},"r10":{"value":0},"r9":{"value":18446744073709551615},"r15":{"value":123145490611064},"rbx":{"value":123145490612224},"trap":{"value":133},"err":{"value":33554800},"r11":{"value":582},"rip":{"value":140703284193332},"rbp":{"value":0},"rsp":{"value":123145490612224},"r12":{"value":5193732},"rcx":{"value":0},"flavor":"x86_THREAD_STATE","rdi":{"value":123145490612224}}},{"id":2443301,"frames":[{"imageOffset":6196,"symbol":"start_wqthread","symbolLocation":0,"imageIndex":19}],"threadState":{"r13":{"value":0},"rax":{"value":33554800},"rflags":{"value":512},"cpu":{"value":0},"r14":{"value":0},"rsi":{"value":115515},"r8":{"value":409604},"cr2":{"value":0},"rdx":{"value":123145489551360},"r10":{"value":0},"r9":{"value":18446744073709551615},"r15":{"value":0},"rbx":{"value":123145490075648},"trap":{"value":133},"err":{"value":33554800},"r11":{"value":582},"rip":{"value":140703284193332},"rbp":{"value":0},"rsp":{"value":123145490075648},"r12":{"value":0},"rcx":{"value":0},"flavor":"x86_THREAD_STATE","rdi":{"value":123145490075648}}},{"id":2443302,"frames":[{"imageOffset":6196,"symbol":"start_wqthread","symbolLocation":0,"imageIndex":19}],"threadState":{"r13":{"value":0},"rax":{"value":33554800},"rflags":{"value":512},"cpu":{"value":0},"r14":{"value":1},"rsi":{"value":168199},"r8":{"value":409604},"cr2":{"value":0},"rdx":{"value":123145491161088},"r10":{"value":0},"r9":{"value":18446744073709551615},"r15":{"value":123145491684216},"rbx":{"value":123145491685376},"trap":{"value":133},"err":{"value":33554800},"r11":{"value":582},"rip":{"value":140703284193332},"rbp":{"value":0},"rsp":{"value":123145491685376},"r12":{"value":5128197},"rcx":{"value":0},"flavor":"x86_THREAD_STATE","rdi":{"value":123145491685376}}},{"id":2443303,"frames":[{"imageOffset":6196,"symbol":"start_wqthread","symbolLocation":0,"imageIndex":19}],"threadState":{"r13":{"value":0},"rax":{"value":0},"rflags":{"value":512},"cpu":{"value":0},"r14":{"value":0},"rsi":{"value":0},"r8":{"value":278532},"cr2":{"value":0},"rdx":{"value":123145491697664},"r10":{"value":0},"r9":{"value":18446744073709551615},"r15":{"value":0},"rbx":{"value":0},"trap":{"value":0},"err":{"value":0},"r11":{"value":0},"rip":{"value":140703284193332},"rbp":{"value":0},"rsp":{"value":123145492221952},"r12":{"value":0},"rcx":{"value":0},"flavor":"x86_THREAD_STATE","rdi":{"value":123145492221952}}},{"id":2443450,"name":"com.apple.audio.toolbox.AUScheduledParameterRefresher","threadState":{"r13":{"value":0},"rax":{"value":14},"rflags":{"value":515},"cpu":{"value":0},"r14":{"value":105553119318008},"rsi":{"value":105553165325728},"r8":{"value":105553165325696},"cr2":{"value":0},"rdx":{"value":6},"r10":{"value":0},"r9":{"value":53},"r15":{"value":0},"rbx":{"value":105553119317761},"trap":{"value":133},"err":{"value":16777252},"r11":{"value":515},"rip":{"value":140703283940038},"rbp":{"value":123145494368112},"rsp":{"value":123145494368072},"r12":{"value":0},"rcx":{"value":123145494368072},"flavor":"x86_THREAD_STATE","rdi":{"value":170263}},"frames":[{"imageOffset":2758,"symbol":"semaphore_wait_trap","symbolLocation":10,"imageIndex":17},{"imageOffset":6722,"symbol":"caulk::semaphore::timed_wait(double)","symbolLocation":158,"imageIndex":18},{"imageOffset":6500,"symbol":"caulk::concurrent::details::worker_thread::run()","symbolLocation":30,"imageIndex":18},{"imageOffset":5800,"symbol":"void* caulk::thread_proxy<std::__1::tuple<caulk::thread::attributes, void (caulk::concurrent::details::worker_thread::*)(), std::__1::tuple<caulk::concurrent::details::worker_thread*>>>(void*)","symbolLocation":41,"imageIndex":18},{"imageOffset":24049,"symbol":"_pthread_start","symbolLocation":99,"imageIndex":19},{"imageOffset":6231,"symbol":"thread_start","symbolLocation":15,"imageIndex":19}]}], "usedImages" : [ { "source" : "P", "arch" : "x86_64", "base" : 4497543168, "CFBundleShortVersionString" : "1.6.9", "CFBundleIdentifier" : "com.lihaoyun6.QuickRecorder", "size" : 1630208, "uuid" : "ba618c03-821d-3b9f-8a8f-1ef506b204f1", "path" : "\/Applications\/QuickRecorder.app\/Contents\/MacOS\/QuickRecorder", "name" : "QuickRecorder", "CFBundleVersion" : "169" }, { "source" : "P", "arch" : "x86_64", "base" : 4504031232, "CFBundleShortVersionString" : "2.6.0", "CFBundleIdentifier" : "org.sparkle-project.Sparkle", "size" : 278528, "uuid" : "020e997b-9464-39d5-81bf-2767410fb3a8", "path" : "\/Applications\/QuickRecorder.app\/Contents\/Frameworks\/Sparkle.framework\/Versions\/B\/Sparkle", "name" : "Sparkle", "CFBundleVersion" : "2036" }, { "source" : "P", "arch" : "x86_64h", "base" : 4566093824, "size" : 53248, "uuid" : "395104e6-4e58-31b0-8c64-c56f325ce788", "path" : "\/usr\/lib\/libobjc-trampolines.dylib", "name" : "libobjc-trampolines.dylib" }, { "source" : "P", "arch" : "x86_64", "base" : 4711800832, "CFBundleShortVersionString" : "810.0", "CFBundleIdentifier" : "com.apple.cmio.DAL.VDC-4", "size" : 274432, "uuid" : "fb6a30e6-4dd9-327d-902b-231e1775a0d5", "path" : "\/System\/Library\/Frameworks\/CoreMediaIO.framework\/Versions\/A\/Resources\/VDC.plugin\/Contents\/MacOS\/VDC", "name" : "VDC", "CFBundleVersion" : "466.80.2" }, { "source" : "P", "arch" : "x86_64", "base" : 4711378944, "CFBundleShortVersionString" : "1000.0", "CFBundleIdentifier" : "com.apple.cmio.DAL.iOSScreenCapture", "size" : 147456, "uuid" : "afdab9ae-5bbe-3ebd-b1a7-4e7229877a1c", "path" : "\/System\/Library\/Frameworks\/CoreMediaIO.framework\/Versions\/A\/Resources\/iOSScreenCapture.plugin\/Contents\/MacOS\/iOSScreenCapture", "name" : "iOSScreenCapture", "CFBundleVersion" : "5590.122.2.0.1" }, { "source" : "P", "arch" : "x86_64h", "base" : 5108465664, "CFBundleShortVersionString" : "7.0", "CFBundleIdentifier" : "com.apple.audio.codecs.Components", "size" : 10301440, "uuid" : "d9768fd2-eb2f-3c9c-b094-0bcbf92cc765", "path" : "\/System\/Library\/Components\/AudioCodecs.component\/Contents\/MacOS\/AudioCodecs", "name" : "AudioCodecs", "CFBundleVersion" : "7.0" }, { "source" : "P", "arch" : "x86_64", "base" : 4547031040, "CFBundleShortVersionString" : "1.14", "CFBundleIdentifier" : "com.apple.audio.units.Components", "size" : 1335296, "uuid" : "b7d2daa6-a2bf-3019-b6bc-6bf72550f719", "path" : "\/System\/Library\/Components\/CoreAudio.component\/Contents\/MacOS\/CoreAudio", "name" : "CoreAudio", "CFBundleVersion" : "1.14" }, { "source" : "P", "arch" : "x86_64", "base" : 5077602304, "CFBundleShortVersionString" : "1000.0", "CFBundleIdentifier" : "com.apple.CMIOBaseUnits", "size" : 1396736, "uuid" : "dab238cc-df97-39f5-81aa-678006e2217b", "path" : "\/System\/Library\/Frameworks\/CoreMediaIO.framework\/Versions\/A\/Resources\/BaseUnits\/CMIOBaseUnits.bundle\/Contents\/MacOS\/CMIOBaseUnits", "name" : "CMIOBaseUnits", "CFBundleVersion" : "5590.122.2.0.1" }, { "source" : "P", "arch" : "x86_64", "base" : 5076209664, "CFBundleShortVersionString" : "1000.0", "CFBundleIdentifier" : "com.apple.CMIOUnits", "size" : 741376, "uuid" : "e0f38971-a56e-36e1-b383-20c72563c717", "path" : "\/System\/Library\/Frameworks\/CoreMediaIO.framework\/Versions\/A\/Resources\/CMIOUnits.bundle\/Contents\/MacOS\/CMIOUnits", "name" : "CMIOUnits", "CFBundleVersion" : "5590.122.2.0.1" }, { "source" : "P", "arch" : "x86_64h", "base" : 140703284658176, "CFBundleShortVersionString" : "6.9", "CFBundleIdentifier" : "com.apple.CoreFoundation", "size" : 4935667, "uuid" : "2f3a4185-6038-37d0-a02b-ec620bcd977b", "path" : "\/System\/Library\/Frameworks\/CoreFoundation.framework\/Versions\/A\/CoreFoundation", "name" : "CoreFoundation", "CFBundleVersion" : "3502.1.401" }, { "source" : "P", "arch" : "x86_64", "base" : 140703302881280, "CFBundleShortVersionString" : "6.9", "CFBundleIdentifier" : "com.apple.Foundation", "size" : 14620850, "uuid" : "3e72de1d-c81a-3c8b-9c06-5b1e3186de47", "path" : "\/System\/Library\/Frameworks\/Foundation.framework\/Versions\/C\/Foundation", "name" : "Foundation", "CFBundleVersion" : "3502.1.401" }, { "source" : "P", "arch" : "x86_64", "base" : 140703346135040, "CFBundleShortVersionString" : "6.9", "CFBundleIdentifier" : "com.apple.AppKit", "size" : 22356791, "uuid" : "c26f6f9e-8230-3c1f-8c48-02d9de58fbc8", "path" : "\/System\/Library\/Frameworks\/AppKit.framework\/Versions\/C\/AppKit", "name" : "AppKit", "CFBundleVersion" : "2575.60.5" }, { "source" : "P", "arch" : "x86_64", "base" : 140703480422400, "CFBundleShortVersionString" : "2.1.1", "CFBundleIdentifier" : "com.apple.HIToolbox", "size" : 3020526, "uuid" : "1ed7a7b9-e12f-348a-ac39-834f923795b6", "path" : "\/System\/Library\/Frameworks\/Carbon.framework\/Versions\/A\/Frameworks\/HIToolbox.framework\/Versions\/A\/HIToolbox", "name" : "HIToolbox" }, { "source" : "P", "arch" : "x86_64", "base" : 140707845881856, "CFBundleShortVersionString" : "6.5.4", "CFBundleIdentifier" : "com.apple.SwiftUI", "size" : 19220906, "uuid" : "83eb36e0-aeb7-36dd-a912-42fbb13eb403", "path" : "\/System\/Library\/Frameworks\/SwiftUI.framework\/Versions\/A\/SwiftUI", "name" : "SwiftUI", "CFBundleVersion" : "6.5.4" }, { "source" : "P", "arch" : "x86_64", "base" : 140703280361472, "size" : 632104, "uuid" : "3771ea6a-0fe5-3b63-961d-c09e01d5e680", "path" : "\/usr\/lib\/dyld", "name" : "dyld" }, { "size" : 0, "source" : "A", "base" : 0, "uuid" : "00000000-0000-0000-0000-000000000000" }, { "source" : "P", "arch" : "x86_64h", "base" : 140703280074752, "size" : 282716, "uuid" : "de35b5ee-5872-3e5a-a1f0-eb18c5b0434c", "path" : "\/usr\/lib\/libobjc.A.dylib", "name" : "libobjc.A.dylib" }, { "source" : "P", "arch" : "x86_64", "base" : 140703283937280, "size" : 248656, "uuid" : "dab10aa4-8afa-3d02-9cde-6023554ac858", "path" : "\/usr\/lib\/system\/libsystem_kernel.dylib", "name" : "libsystem_kernel.dylib" }, { "source" : "P", "arch" : "x86_64", "base" : 140703475974144, "CFBundleShortVersionString" : "1.0", "CFBundleIdentifier" : "com.apple.audio.caulk", "size" : 146696, "uuid" : "22877e7f-c603-37d7-8c72-9d864ee6e99d", "path" : "\/System\/Library\/PrivateFrameworks\/caulk.framework\/Versions\/A\/caulk", "name" : "caulk" }, { "source" : "P", "arch" : "x86_64", "base" : 140703284187136, "size" : 48592, "uuid" : "a6d1f05a-0743-31b7-9fe2-268f06ccd51a", "path" : "\/usr\/lib\/system\/libsystem_pthread.dylib", "name" : "libsystem_pthread.dylib" }, { "source" : "P", "arch" : "x86_64", "base" : 140703381131264, "CFBundleShortVersionString" : "1.600.0", "CFBundleIdentifier" : "com.apple.SkyLight", "size" : 5033928, "uuid" : "5614b329-06ef-3851-9d89-9ff5e56c9b74", "path" : "\/System\/Library\/PrivateFrameworks\/SkyLight.framework\/Versions\/A\/SkyLight", "name" : "SkyLight" } ], "sharedCache" : { "base" : 140703251918848, "size" : 30064771072, "uuid" : "57b0c2b8-36d6-3cf0-8bd0-0ac6133ec8b3" }, "vmSummary" : "ReadOnly portion of Libraries: Total=1.3G resident=0K(0%) swapped_out_or_unallocated=1.3G(100%)\nWritable regions: Total=667.8M written=460K(0%) resident=0K(0%) swapped_out=460K(0%) unallocated=667.4M(100%)\n\n VIRTUAL REGION \nREGION TYPE SIZE COUNT (non-coalesced) \n=========== ======= ======= \nAccelerate framework 128K 1 \nActivity Tracing 256K 1 \nAttributeGraph Data 1024K 1 \nCG image 152K 17 \nColorSync 108K 11 \nCoreAnimation 7736K 80 \nCoreGraphics 12K 2 \nCoreImage 6892K 1 \nCoreUI image data 3660K 29 \nFoundation 36K 2 \nImage IO 12K 2 \nKernel Alloc Once 8K 1 \nMALLOC 641.5M 80 \nMALLOC guard page 64K 16 \nSTACK GUARD 56.0M 11 \nStack 13.1M 11 \nVM_ALLOCATE 3344K 23 \n__CTF 824 1 \n__DATA 35.2M 958 \n__DATA_CONST 103.0M 974 \n__DATA_DIRTY 2578K 338 \n__FONT_DATA 2352 1 \n__INFO_FILTER 8 1 \n__LINKEDIT 167.2M 11 \n__OBJC_RO 61.3M 1 \n__OBJC_RW 2395K 2 \n__TEXT 1.1G 993 \n__TPRO_CONST 16 2 \nmapped file 621.5M 75 \nshared memory 2328K 19 \n=========== ======= ======= \nTOTAL 2.8G 3665 \n", "legacyInfo" : { "threadTriggered" : { "queue" : "com.apple.main-thread" } }, "logWritingSignature" : "c0103918e89fc14d7dac627078dd586e9e9a3128", "trialInfo" : { "rollouts" : [ { "rolloutId" : "5fb4245a1bbfe8005e33a1e1", "factorPackIds" : { }, "deploymentId" : 240000021 }, { "rolloutId" : "67fd77fe1f9da9148f70d6ed", "factorPackIds" : { }, "deploymentId" : 240000011 } ], "experiments" : [ ] } } Model: MacBookAir9,1, BootROM 2075.120.2.0.0 (iBridge: 22.16.15072.0.0,0), 2 processors, Dual-Core Intel Core i3, 1.1 GHz, 8 GB, SMC Graphics: Intel Iris Plus Graphics, Intel Iris Plus Graphics, Built-In Display: Color LCD, 2560 x 1600 Retina, Main, MirrorOff, Online Memory Module: BANK 0/ChannelA-DIMM0, 4 GB, LPDDR4X, 3733 MHz, Samsung, K3UH5H50MM-JGCJ Memory Module: BANK 2/ChannelB-DIMM0, 4 GB, LPDDR4X, 3733 MHz, Samsung, K3UH5H50MM-JGCJ AirPort: spairport_wireless_card_type_wifi (0x14E4, 0x870), wl0: Jul 26 2024 20:45:01 version 16.20.380.0.3.6.130 FWID 01-c866e60e AirPort: Bluetooth: Version (null), 0 services, 0 devices, 0 incoming serial ports Network Service: Wi-Fi, AirPort, en0 USB Device: USB31Bus USB Device: USB31Bus USB Device: T2Bus USB Device: Touch Bar Backlight USB Device: Apple Internal Keyboard / Trackpad USB Device: Headset USB Device: Ambient Light Sensor USB Device: FaceTime HD Camera (Built-in) USB Device: Apple T2 Controller Thunderbolt Bus: MacBook Air, Apple Inc., 86.0 翻译
最新发布
08-01
# -*- coding: utf-8 -*- """整合气象数据获取与处理系统 功能: 1. 在5分钟整点(0分、5分、10分等)获取实况气象数据 2. 将5分钟数据按月保存到Excel(存储在"5分钟级数据"文件夹) 3. 将5分钟数据插值为分钟级数据 4. 计算每分钟的太阳位置(高度角、方位角)和地外辐照度(保留两位小数) 5. 将分钟级数据按月保存到独立Excel(存储在"分钟级数据"文件夹) """ import urllib, urllib3, sys, uuid import ssl import json from openpyxl import Workbook, load_workbook from datetime import datetime, timedelta import warnings from urllib3.exceptions import InsecureRequestWarning import time import os import pandas as pd import numpy as np from scipy.interpolate import CubicSpline import math import openpyxl from openpyxl.styles import PatternFill, Font, Alignment import traceback # 强制刷新标准输出 - 确保实时输出 sys.stdout = sys.__stdout__ sys.stderr = sys.__stderr__ if hasattr(sys.stdout, 'reconfigure'): sys.stdout.reconfigure(line_buffering=True) # 确保实时输出 else: # 对于不支持reconfigure的环境 sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 1) # 禁用SSL警告 warnings.filterwarnings("ignore", category=InsecureRequestWarning) # 创建绕过SSL验证的连接池 http = urllib3.PoolManager(cert_reqs='CERT_NONE') # API配置 host = 'http://aliv18.data.moji.com' condition_path = '/whapi/json/alicityweather/condition' method = 'POST' appcode = '2c642e12da774c918fa78ac56b5b4c50' # 保定地理位置 LOCATION_NAME = "保定" LONGITUDE = 115.480 # 东经 LATITUDE = 38.855 # 北纬 # 定义API请求头 API_HEADERS = { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Authorization': 'APPCODE ' + appcode } # 实况数据API参数 CONDITION_TOKEN = '50b53ff8dd7d9fa320d3d3ca32cf8ed1' CITY_ID = '1819' # 保定城市ID # 创建数据存储目录 FIVEMIN_DIR = "5分钟级数据" MINUTELY_DIR = "分钟级数据" os.makedirs(FIVEMIN_DIR, exist_ok=True) os.makedirs(MINUTELY_DIR, exist_ok=True) def log_message(message): """记录日志到屏幕 - 确保实时输出""" timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S') log_line = f"[{timestamp}] {message}" # 直接输出到控制台,强制刷新 print(log_line, flush=True) # 同时写入日志文件以便调试 with open("weather_system.log", "a", encoding="utf-8") as log_file: log_file.write(log_line + "\n") log_file.flush() # 立即刷新文件写入 def safe_save(wb, filename): """安全保存Excel文件,避免占用问题""" log_message(f"正在保存文件: {filename}") # 确保目标目录存在 os.makedirs(os.path.dirname(filename), exist_ok=True) for attempt in range(5): # 增加尝试次数 try: # 使用绝对路径避免相对路径问题 abs_filename = os.path.abspath(filename) temp_file = abs_filename.replace(".xlsx", f"_temp_{attempt}.xlsx") log_message(f"尝试保存临时文件: {temp_file}") wb.save(temp_file) # 替换原文件 if os.path.exists(abs_filename): os.remove(abs_filename) os.rename(temp_file, abs_filename) log_message(f"文件保存成功: {abs_filename}") return True except (PermissionError, OSError) as e: log_message(f"文件保存失败 ({attempt+1}/5): {str(e)}") time.sleep(3) except Exception as e: log_message(f"文件保存时发生意外错误: {str(e)}") traceback.print_exc() time.sleep(3) return False def get_condition_data(): """获取实况天气数据""" try: log_message(f"正在获取{LOCATION_NAME}实况天气数据...") condition_bodys = {'token': CONDITION_TOKEN, 'cityId': CITY_ID} post_data_condition = urllib.parse.urlencode(condition_bodys).encode('utf-8') condition_url = host + condition_path response_condition = http.request('POST', condition_url, body=post_data_condition, headers=API_HEADERS) content_condition = response_condition.data.decode('utf-8') condition_data = json.loads(content_condition) log_message(f"API响应内容: {json.dumps(condition_data, ensure_ascii=False)[:200]}...") if condition_data.get('code') != 0: log_message(f"实况API请求失败: 代码 {condition_data.get('code')}, 消息: {condition_data.get('msg')}") return None condition_info = condition_data['data']['condition'] current_time = datetime.now() # 对齐到最近的5分钟 aligned_minute = (current_time.minute // 5) * 5 aligned_time = current_time.replace(minute=aligned_minute, second=0, microsecond=0) time_str = aligned_time.strftime("%Y-%m-%d %H:%M") # 计算风速(m/s)并保留一位小数 raw_wind_speed = condition_info.get('windSpeed', '') wind_speed_mps = '' if raw_wind_speed and raw_wind_speed.replace('.', '', 1).isdigit(): try: wind_speed_mps = round(float(raw_wind_speed) / 3.6, 1) # 保留一位小数 except: wind_speed_mps = '' # 处理温度值,确保保留一位小数 temp_value = condition_info.get('temp', '') if temp_value and temp_value.replace('.', '', 1).isdigit(): try: temp_value = round(float(temp_value), 1) # 温度保留一位小数 except: pass # 构建实况数据行 condition_row = [ time_str, temp_value, # 温度保留一位小数 condition_info.get('condition', ''), condition_info.get('humidity', ''), condition_info.get('windDir', ''), condition_info.get('windLevel', ''), raw_wind_speed, wind_speed_mps, # 风速保留一位小数 condition_info.get('precip', '0.0'), condition_info.get('pressure', '') ] log_message(f"成功获取实况数据: {time_str}") log_message(f" 温度: {temp_value}℃, 天气状况: {condition_info.get('condition', '')}, 湿度: {condition_info.get('humidity', '')}%") return condition_row except Exception as e: log_message(f"获取实况数据时出错: {str(e)}") traceback.print_exc() return None def normalize_time(time_str): """统一时间格式为 YYYY-MM-DD HH:MM""" try: # 如果已经是字符串,尝试解析 if isinstance(time_str, str): # 尝试解析为日期时间 if len(time_str) == 16: # 格式为 "YYYY-MM-DD HH:MM" return time_str elif len(time_str) == 19: # 包含秒数 "YYYY-MM-DD HH:MM:00" return time_str[:16] elif ' ' not in time_str: # 只有日期部分 return time_str + " 00:00" else: # 其他格式,尝试转换 dt = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S") return dt.strftime("%Y-%m-%d %H:%M") # 如果是datetime对象 elif isinstance(time_str, datetime): return time_str.strftime("%Y-%m-%d %H:%M") except Exception: pass # 无法识别的格式,原样返回 return str(time_str) def update_fivemin_excel(condition_row): """更新5分钟级Excel文件""" try: current_month = datetime.now().strftime("%Y%m") # 确保目录存在 os.makedirs(FIVEMIN_DIR, exist_ok=True) filename = os.path.join(os.path.abspath(FIVEMIN_DIR), f"{LOCATION_NAME}_5分钟级数据_{current_month}.xlsx") wb = None ws = None existing_data = {} # 存储时间点 -> 行号的映射 headers = [] log_message(f"正在更新5分钟数据文件: {filename}") if os.path.exists(filename): for attempt in range(3): try: log_message(f"尝试加载现有5分钟数据文件... (尝试 {attempt+1}/3)") wb = load_workbook(filename) ws = wb.active if ws.max_row > 0: headers = [cell.value for cell in ws[1]] # 读取现有数据到字典 (时间 -> 行号) for row_idx, row in enumerate(ws.iter_rows(min_row=2, values_only=True), start=2): if not row or not row[0]: continue time_key = normalize_time(row[0]) if time_key in existing_data: log_message(f"警告: 发现重复时间点: {time_key} (行 {row_idx})") existing_data[time_key] = row_idx log_message(f"成功加载现有5分钟数据文件: {filename} (共 {len(existing_data)} 条记录)") break except PermissionError: if attempt < 2: log_message(f"文件被占用,等待5秒后重试 ({attempt+1}/3)") time.sleep(5) else: log_message("无法打开文件,创建新工作簿") wb = Workbook() ws = wb.active ws.title = f"{LOCATION_NAME}5分钟级数据" headers = ["时间", "温度(℃)", "天气状况", "湿度(%)", "风向", "风力等级", "原始风速(km/h)", "风速(m/s)", "降水量(mm)", "气压(hPa)"] ws.append(headers) else: wb = Workbook() ws = wb.active ws.title = f"{LOCATION_NAME}5分钟极数据" headers = ["时间", "温度(℃)", "天气状况", "湿度(%)", "风向", "风力等级", "原始风速(km/h)", "风速(m/s)", "降水量(mm)", "气压(hPa)"] ws.append(headers) log_message(f"创建新的5分钟数据文件: {filename}") if not headers: headers = ["时间", "温度(℃)", "天气状况", "湿度(%)", "风向", "风力等级", "原始风速(km/h)", "风速(m/s)", "降水量(mm)", "气压(hPa)"] # 处理实况数据 if condition_row: current_time = condition_row[0] normalized_current = normalize_time(current_time) if normalized_current in existing_data: row_idx = existing_data[normalized_current] # 更新所有字段(覆盖旧数据) for col_idx in range(1, len(condition_row) + 1): new_value = condition_row[col_idx - 1] ws.cell(row=row_idx, column=col_idx, value=new_value) log_message(f"更新5分钟时间点: {normalized_current} (行 {row_idx})") else: ws.append(condition_row) # 更新字典,记录新行号 existing_data[normalized_current] = ws.max_row log_message(f"新增5分钟时间点: {normalized_current} (行 {ws.max_row})") # 保存文件 if safe_save(wb, filename): log_message(f"5分钟数据保存成功: {filename}") return filename else: log_message(f"5分钟数据保存失败") return None except Exception as e: log_message(f"更新5分钟数据文件时出错: {str(e)}") traceback.print_exc() return None def calculate_solar_parameters(dt, longitude, latitude): """计算太阳高度角、方位角和地外辐照度(高度角和方位角保留两位小数)""" try: # 将时间转换为UTC+0 utc_time = dt - timedelta(hours=8) n = utc_time.timetuple().tm_yday # 年中的第几天 # 计算太阳赤纬 (δ) delta = 23.45 * math.sin(math.radians(360 * (284 + n) / 365)) delta_rad = math.radians(delta) # 计算时角 (ω) utc_hour = utc_time.hour + utc_time.minute/60.0 omega = (utc_hour - 12) * 15 + longitude omega_rad = math.radians(omega) # 纬度转弧度 phi_rad = math.radians(latitude) # 计算太阳高度角 (α) sin_alpha = math.sin(phi_rad) * math.sin(delta_rad) + math.cos(phi_rad) * math.cos(delta_rad) * math.cos(omega_rad) alpha = math.degrees(math.asin(sin_alpha)) # 计算太阳方位角 (γ) sin_gamma = -math.cos(delta_rad) * math.sin(omega_rad) / math.cos(math.radians(alpha)) cos_gamma = (math.sin(delta_rad) * math.cos(phi_rad) - math.cos(delta_rad) * math.sin(phi_rad) * math.cos(omega_rad)) / math.cos(math.radians(alpha)) gamma = math.degrees(math.atan2(sin_gamma, cos_gamma)) gamma = (gamma + 360) % 360 # 转换为0-360度范围 # 计算地外辐照度 (W/m²) g0 = 1367 * (1 + 0.033 * math.cos(math.radians(360 * n / 365))) * sin_alpha g0 = max(0, g0) # 确保非负 # 保留两位小数 return round(alpha, 2), round(gamma, 2), round(g0, 1) except Exception as e: log_message(f"计算太阳参数错误: {str(e)}") return None, None, None def process_minutely_data(fivemin_file): """处理分钟级数据并添加太阳参数""" try: log_message("="*50) log_message(f"开始生成分钟级数据...") # 检查文件是否存在 if not os.path.exists(fivemin_file): log_message(f"错误: 5分钟数据文件不存在: {fivemin_file}") return None # 读取5分钟数据 log_message(f"读取5分钟数据文件: {fivemin_file}") try: fivemin_df = pd.read_excel(fivemin_file) log_message(f"读取5分钟数据成功,共 {len(fivemin_df)} 行") except Exception as e: log_message(f"读取5分钟数据文件失败: {str(e)}") return None # 查找时间列 time_col = next((col for col in fivemin_df.columns if '时间' in col), None) if not time_col: log_message("未找到时间列") return None # 转换时间格式并处理重复值 fivemin_df[time_col] = pd.to_datetime(fivemin_df[time_col], errors='coerce') # 删除无效行 original_count = len(fivemin_df) fivemin_df = fivemin_df.dropna(subset=[time_col]) if original_count > len(fivemin_df): log_message(f"删除了 {original_count - len(fivemin_df)} 行无效时间数据") # 处理重复时间点 - 保留最后一个 duplicate_mask = fivemin_df.duplicated(subset=[time_col], keep='last') if duplicate_mask.any(): log_message(f"发现 {duplicate_mask.sum()} 个重复时间点,保留最后一个") fivemin_df = fivemin_df[~duplicate_mask] # 按时间排序 fivemin_df = fivemin_df.sort_values(by=time_col) fivemin_df.set_index(time_col, inplace=True) # 创建分钟级时间索引 start_time = fivemin_df.index.min() end_time = fivemin_df.index.max() log_message(f"时间范围: {start_time} 至 {end_time}") minutely_index = pd.date_range(start=start_time, end=end_time, freq='1min') minutely_df = pd.DataFrame(index=minutely_index) log_message(f"将生成 {len(minutely_index)} 条分钟级数据") # 插值处理 - 确保时间戳严格递增 base_time = start_time fivemin_timestamps = (fivemin_df.index - base_time).total_seconds() # 检查时间戳是否严格递增 if not (np.diff(fivemin_timestamps) > 0).all(): log_message("时间戳不是严格递增,尝试修复...") # 重新排序 fivemin_df = fivemin_df.sort_index() fivemin_timestamps = (fivemin_df.index - base_time).total_seconds() minutely_timestamps = (minutely_df.index - base_time).total_seconds() # 对连续参数进行插值 log_message("\n开始数据插值处理...") for param in ['风速(m/s)', '温度(℃)', '湿度(%)', '气压(hPa)']: if param in fivemin_df.columns: param_data = fivemin_df[param].dropna() if len(param_data) >= 3: log_message(f"对 {param} 使用三次样条插值 (数据点: {len(param_data)})") cs = CubicSpline(fivemin_timestamps, param_data.values) interpolated_values = cs(minutely_timestamps) # 对温度和风速保留一位小数 if param in ['温度(℃)', '风速(m/s)']: interpolated_values = np.round(interpolated_values, 1) minutely_df[param] = interpolated_values else: log_message(f"对 {param} 使用前向填充 (有效点不足: {len(param_data)})") minutely_df[param] = fivemin_df[param].resample('1min').ffill() # 处理降水量 if '降水量(mm)' in fivemin_df.columns: log_message("处理降水量数据") # 将5分钟降水量转换为每分钟降水量 precip_min = fivemin_df['降水量(mm)'].resample('1min').asfreq().ffill() minutely_df['降水量(mm)'] = precip_min / 5.0 # 平均分配到每分钟 # 处理文本数据 for param in ['天气状况', '风向']: if param in fivemin_df.columns: log_message(f"处理 {param} 数据") minutely_df[param] = fivemin_df[param].resample('1min').ffill() # 数值列保留适当的小数位数 # 温度和风速保留一位小数 if '温度(℃)' in minutely_df.columns: minutely_df['温度(℃)'] = minutely_df['温度(℃)'].round(1) if '风速(m/s)' in minutely_df.columns: minutely_df['风速(m/s)'] = minutely_df['风速(m/s)'].round(1) # 其他数值列保留一位小数 other_numeric_cols = ['湿度(%)', '气压(hPa)', '降水量(mm)'] for col in other_numeric_cols: if col in minutely_df.columns: minutely_df[col] = minutely_df[col].round(1) # 计算太阳参数 log_message(f"\n开始计算太阳位置和辐照度...") solar_data = [] total_points = len(minutely_df) last_progress = -1 start_time = time.time() for i, dt in enumerate(minutely_df.index): alpha, gamma, g0 = calculate_solar_parameters(dt, LONGITUDE, LATITUDE) solar_data.append({ '太阳高度角(度)': alpha, '太阳方位角(度)': gamma, '地外辐照度(W/m2)': g0 }) # 显示进度 progress = int((i + 1) / total_points * 100) if progress != last_progress and progress % 10 == 0: elapsed = time.time() - start_time remaining = (total_points - i) * (elapsed / (i+1)) log_message(f"计算进度: {progress}% | 预计剩余时间: {remaining:.1f}秒") last_progress = progress solar_df = pd.DataFrame(solar_data, index=minutely_df.index) minutely_df = pd.concat([minutely_df, solar_df], axis=1) # 生成输出文件名 current_month = datetime.now().strftime("%Y%m") filename = f"{LOCATION_NAME}_分钟级数据_{current_month}.xlsx" filepath = os.path.join(os.path.abspath(MINUTELY_DIR), filename) # 保存分钟级数据 minutely_df.reset_index(inplace=True) minutely_df.rename(columns={'index': '时间'}, inplace=True) # 创建Excel工作簿 wb = openpyxl.Workbook() ws = wb.active ws.title = "分钟级数据" # 写入数据 log_message(f"\n正在写入分钟级数据到Excel...") for col_idx, col_name in enumerate(minutely_df.columns, 1): ws.cell(row=1, column=col_idx, value=col_name) for r_idx, row in enumerate(minutely_df.values, 2): for c_idx, value in enumerate(row, 1): ws.cell(row=r_idx, column=c_idx, value=value) # 应用样式 header_fill = PatternFill(start_color="1F4E78", end_color="1F4E78", fill_type="solid") header_font = Font(color="FFFFFF", bold=True) header_alignment = Alignment(horizontal="center", vertical="center") for cell in ws[1]: cell.fill = header_fill cell.font = header_font cell.alignment = header_alignment # 设置列宽 log_message("设置列宽...") for col in ws.columns: max_length = 0 for cell in col: try: if cell.value and len(str(cell.value)) > max_length: max_length = len(str(cell.value)) except: pass adjusted_width = (max_length + 2) * 1.2 ws.column_dimensions[col[0].column_letter].width = min(adjusted_width, 50) # 保存文件 if safe_save(wb, filepath): log_message(f"分钟级数据保存成功: {filepath}") return filepath else: log_message(f"分钟级数据保存失败") return None except Exception as e: log_message(f"处理分钟级数据时出错: {str(e)}") traceback.print_exc() return None def get_weather_data(): """获取天气数据并处理""" log_message(f"\n获取{LOCATION_NAME}实况天气数据...") try: # 获取实况数据 condition_row = get_condition_data() if not condition_row: log_message("获取实况数据失败") return False # 更新5分钟数据文件 fivemin_file = update_fivemin_excel(condition_row) if not fivemin_file: log_message("5分钟数据更新失败") return False # 处理分钟级数据(只在5分钟整点处理) current_minute = datetime.now().minute if current_minute % 5 == 0: # 0分、5分、10分等 log_message(f"当前时间 {datetime.now().strftime('%H:%M')} 是5分钟整点,开始生成分钟级数据") minutely_file = process_minutely_data(fivemin_file) if minutely_file: log_message(f"\n数据处理完成!") log_message(f" 5分钟数据 -> {fivemin_file}") log_message(f" 分钟数据 -> {minutely_file}") else: log_message(f"分钟数据处理失败") else: log_message(f"跳过分钟级数据处理(非5分钟整点)") return True except Exception as e: log_message(f"获取天气数据时出错: {str(e)}") traceback.print_exc() return False # 主程序循环 - 确保实时输出日志 if __name__ == '__main__': try: # 程序启动横幅 - 使用print确保直接输出 print("=" * 70, flush=True) print(f"{LOCATION_NAME}气象数据自动获取与处理系统", flush=True) print(f"系统启动时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}", flush=True) print(f"Python版本: {sys.version}", flush=True) print(f"工作目录: {os.getcwd()}", flush=True) print(f"5分钟数据存储目录: {os.path.abspath(FIVEMIN_DIR)}", flush=True) print(f"分钟数据存储目录: {os.path.abspath(MINUTELY_DIR)}", flush=True) print("=" * 70, flush=True) print("按 Ctrl+C 停止程序", flush=True) print("=" * 70, flush=True) # 初始执行一次 log_message("\n执行初始数据获取...") success = get_weather_data() # 主循环 current_month = datetime.now().month while True: try: # 计算到下一个整分钟的时间(确保在0秒执行) now = datetime.now() next_minute = now.replace(second=0, microsecond=0) + timedelta(minutes=1) wait_seconds = (next_minute - now).total_seconds() if wait_seconds > 0: wait_minutes = wait_seconds / 60 log_message(f"\n等待 {wait_seconds:.1f} 秒 ({wait_minutes:.2f} 分钟) 到下一个整分钟") time.sleep(wait_seconds) # 检查月份变化 new_month = datetime.now().month if new_month != current_month: log_message(f"\n月份变更: {current_month} -> {new_month}") current_month = new_month # 获取并处理数据 log_message("\n" + "="*70) log_message(f"开始新一轮数据采集 ({datetime.now().strftime('%Y-%m-%d %H:%M:%S')})") success = get_weather_data() except KeyboardInterrupt: log_message("\n程序已停止") break except Exception as e: # 获取详细错误信息 exc_type, exc_value, exc_traceback = sys.exc_info() error_details = traceback.format_exception(exc_type, exc_value, exc_traceback) error_msg = ''.join(error_details) log_message(f"\n主循环错误: {str(e)}") log_message(f"详细错误信息:\n{error_msg}") log_message("5分钟后重试...") time.sleep(300) # 5分钟后重试 # 重新计算下一个整分钟时间 now = datetime.now() next_minute = now.replace(second=0, microsecond=0) + timedelta(minutes=1) current_month = datetime.now().month log_message(f"新的重试时间: {next_minute.strftime('%Y-%m-%d %H:%M:%S')}") except Exception as e: # 启动错误处理 print(f"程序启动失败: {str(e)}", flush=True) traceback.print_exc(file=sys.stdout)把这段程序也用上面那个方法实现在Python程序在运行时在页面显示结果
07-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值