如何将按日期紧凑存储的TXT文件数据导入Python Pandas并规整为标准格式(无需手动重复日期)
解决方案:自动补全日期并转换为目标格式
没问题!这种日期仅在当天首条记录出现的文本格式,用pandas完全可以自动处理,不用手动补全重复日期。下面分别实现你需要的两种格式:
前置准备
首先确保你已经安装了pandas,然后准备好你的TXT文件(假设文件名为purchase_records.txt)。
格式一:新增独立的Date列
这种方案会保留Date和Time两个独立列,自动补全缺失的日期:
import pandas as pd # 1. 按行读取文本文件 with open('purchase_records.txt', 'r', encoding='utf-8') as f: lines = f.readlines() # 2. 处理表头和初始化数据容器 header = lines[0].strip().split() data_list = [] current_date = None # 3. 逐行处理数据 for line in lines[1:]: line = line.strip() if not line: continue # 跳过空行 # 拆分每行内容,最多拆3部分(兼容带空格的物品名称) parts = line.split(maxsplit=2) # 判断当前行是否包含日期(这里默认日期是8位数字,如20120701) if len(parts[0]) == 8: current_date = parts[0] time_str = parts[1] item = parts[2] else: time_str = parts[0] item = parts[1] data_list.append([current_date, time_str, item]) # 4. 转换为DataFrame df_format1 = pd.DataFrame(data_list, columns=['Date', 'Time', 'Purchasing_item']) print(df_format1)
运行后会得到你需要的格式:
Date Time Purchasing_item 0 20120701 00:00 Apple pie 1 20120701 00:01 Coca-cola 2 20120702 00:00 Pepsi 3 20120702 00:01 Fish-ball
格式二:合并日期与时间为Timestamp列
这种方案会把日期和时间合并成一个完整的时间戳列(可以是字符串类型或datetime类型):
import pandas as pd # 前面的读取和处理步骤和格式一完全一致 with open('purchase_records.txt', 'r', encoding='utf-8') as f: lines = f.readlines() header = lines[0].strip().split() data_list = [] current_date = None for line in lines[1:]: line = line.strip() if not line: continue parts = line.split(maxsplit=2) if len(parts[0]) == 8: current_date = parts[0] time_str = parts[1] item = parts[2] else: time_str = parts[0] item = parts[1] data_list.append([current_date, time_str, item]) # 转换为DataFrame后合并日期和时间 df_format2 = pd.DataFrame(data_list, columns=['Date', 'Time', 'Purchasing_item']) # 选项1:合并为datetime类型的时间戳(推荐,方便后续时间操作) df_format2['Time'] = pd.to_datetime(df_format2['Date'] + ' ' + df_format2['Time']) # 选项2:合并为字符串类型的时间(如果不需要datetime功能) # df_format2['Time'] = df_format2['Date'] + ' ' + df_format2['Time'] # 删除多余的Date列 df_format2 = df_format2.drop('Date', axis=1) print(df_format2)
运行后得到的结果(以datetime类型为例):
Time Purchasing_item 0 2012-07-01 00:00:00 Apple pie 1 2012-07-01 00:01:00 Coca-cola 2 2012-07-02 00:00:00 Pepsi 3 2012-07-02 00:01:00 Fish-ball
关键说明
- 使用
split(maxsplit=2)是为了兼容带空格的物品名称(比如Apple pie),避免把物品名称拆分成多个部分; - 判断日期的逻辑(
len(parts[0]) == 8)可以根据你的实际日期格式调整,比如如果日期是2012-07-01,可以改成'-' in parts[0]; - 处理空行是为了避免读取文件时遇到空行导致报错。
内容的提问来源于stack exchange,提问作者KiuSandy
相关产品推荐
相关产品推荐

