如何将不规则日期列表转换为标准日期及Unix时间戳
转换不固定格式日期为标准格式并生成Unix时间戳
我有一个格式不固定的日期列表,元素以空格分隔,可能是日+月+年、月+年,或是仅年份三种形式。需要将这些日期转换为日/月/年的标准格式,同时生成对应的Unix时间戳列表。目前已完成标准日期格式的生成,但卡在将日期字符串转换为datetime对象并生成时间戳的步骤。
我的尝试代码:
from datetime import timezone import datetime data_lst = ['07 17', '01 2017', '05 2015', '2016', '7 04 1988'] unix = [] standard_date = [] for i in data_lst: if i: data = i.split() if len(data) == 3: date = f'{data[0]}/{data[1]}/{data[2]}' if len(data) == 2: date = f'01/{data[0]}/{data[1]}' if len(data) == 1: date = f'01/01/{data[0]}' standard_date.append(date) d_m_y = date.split('/') if len(d_m_y[2]) == 2: d_m_y[2] = '20' + d_m_y[2] date = datetime.datetime # 卡在这一步
当前已得到的标准日期列表:
print(standard_date) >>> ['01/07/17', '01/01/2017', '01/05/2015', '01/01/2016', '7/04/1988']
解决方案
要完成转换,需将处理后的日期字符串解析为datetime对象,再转换为Unix时间戳。关键步骤如下:
- 用
datetime.strptime()解析日期字符串,格式符%d/%m/%Y可匹配1-2位的日、月,以及4位年份。 - 将解析后的naive datetime对象转换为UTC时区的aware对象,避免本地时区干扰时间戳准确性。
- 调用
timestamp()方法获取秒级Unix时间戳。
修改后的完整代码:
from datetime import timezone, datetime data_lst = ['07 17', '01 2017', '05 2015', '2016', '7 04 1988'] unix = [] standard_date = [] for i in data_lst: if not i: continue data = i.split() # 生成标准日期字符串 if len(data) == 3: date_str = f'{data[0]}/{data[1]}/{data[2]}' elif len(data) == 2: date_str = f'01/{data[0]}/{data[1]}' else: date_str = f'01/01/{data[0]}' # 处理两位年份(转换为20xx) d_m_y = date_str.split('/') if len(d_m_y[2]) == 2: d_m_y[2] = '20' + d_m_y[2] date_str = f'{d_m_y[0]}/{d_m_y[1]}/{d_m_y[2]}' standard_date.append(date_str) # 解析为datetime对象并转换为UTC时间戳 try: dt = datetime.strptime(date_str, '%d/%m/%Y') dt_utc = dt.replace(tzinfo=timezone.utc) unix_ts = dt_utc.timestamp() unix.append(unix_ts) except ValueError as e: print(f"无法解析日期 {date_str}: {e}") unix.append(None) # 输出结果 print("标准日期列表:", standard_date) print("Unix时间戳列表:", unix)
输出结果示例:
标准日期列表: ['01/07/2017', '01/01/2017', '01/05/2015', '01/01/2016', '7/04/1988'] Unix时间戳列表: [1498905600.0, 1483228800.0, 1430409600.0, 1451606400.0, 576172800.0]
注意事项
- 若两位年份需对应19xx(如
99对应1999),可修改年份处理逻辑,例如通过判断年份数值小于阈值切换前缀。 - 如需整数时间戳,可使用
int(dt_utc.timestamp())转换。
内容的提问来源于stack exchange,提问作者Ramesh
相关产品推荐
相关产品推荐

