pandas中Int类型时间戳转换为Datetime格式的正确方法
本文详解在pandas中将整数类型的时间戳转换为datetime格式的正确步骤。指出直接转换导致的1970年错误,并演示先转为字符串再使用to_datetime()的修正方案。同时介绍DatetimeIndex、date_range生成时间序列,以及利用dt属性提取时间分量和Timedelta计算时间差的高级用法。
在数据处理过程中,经常需要将整数类型的时间戳转换为标准的datetime格式,以便进行后续的时间序列分析。
首先观察原始数据中的时间格式,通常表现为连续的数字字符串,例如年月日时分秒拼接而成的整数。
users['timestamp_first_active'].head()查看原始数据的前几行,可以看到名为timestamp_first_active的列包含类似20090319043255这样的数值。
原始数据示例如下: 0 20090319043255 1 20090523174809 2 20090609231247 3 20091031060129 4 20091208061105 Name: timestamp_first_active, dtype: object
如果直接使用pandas的to_datetime函数对整数进行转换,往往会得到错误的结果。
pd.to_datetime(sers['timestamp_first_active'])这种错误转换的结果通常显示为1970年1月1日附近的某个时间点,且带有微秒级的偏移,这显然不符合实际业务逻辑。
错误转换后的数据示例如下: 0 1970-01-01 00:00:00.020201010 1 1970-01-01 00:00:00.020200920 Name: time, dtype: datetime64[ns]
为了获得正确的datetime格式,需要采取特定的转换策略。
正确的做法是先将整数列转换为字符串类型,然后再使用pandas的to_datetime方法进行解析。
users['timestamp_first_active']=users['timestamp_first_active'].astype('str')
users['timestamp_first_active']=pd.to_datetime(users['timestamp_first_active'])接下来介绍pandas中处理时间数据的核心功能。
其中,转化时间类型是最基础且常用的操作。
pandas提供了to_datetime()方法,专门用于将各种数据类型转换为时间类型。
该方法支持多种输入格式,包括int、float、str、datetime、list、tuple、一维数组、Series以及DataFrame/dict-like类型的数据,均可转化为标准的时间类型。
import pandas as pd
# str ---> 转化为时间类型:
ret = pd.to_datetime('2022-3-9')
print(ret)
print(type(ret))
"""
2022-03-09 00:00:00
<class 'pandas._libs.tslibs.timestamps.Timestamp'> ---pandas中默认支持的时间点的类型
"""
# 字符串的序列 --->转化成时间类型:
ret = pd.to_datetime(['2022-3-9', '2022-3-8', '2022-3-7', '2022-3-6'])
print(ret)
print(type(ret))
"""
DatetimeIndex(['2022-03-09', '2022-03-08', '2022-03-07', '2022-03-06'], dtype='datetime64[ns]', freq=None)
<class 'pandas.core.indexes.datetimes.DatetimeIndex'> ----pandas中默认支持的时间序列的类型
"""
# dtype = 'datetime64[ns]' ----> numpy中的时间数据类型!除了to_datetime,DatetimeIndex()方法也是处理时间序列的重要工具。
该方法专门用于将一维类数组(array-like (1-dimensional))数据转换为时间序列索引对象。
# pd.DatetimeIndex 将 字符串序列 转化为 时间序列
ret = pd.DatetimeIndex(['2022-3-9', '2022-3-8', '2022-3-7', '2022-3-6'])
print(ret)
print(type(ret))
"""
DatetimeIndex(['2022-03-09', '2022-03-08', '2022-03-07', '2022-03-06'], dtype='datetime64[ns]', freq=None)
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>
"""在实际应用中,有时需要生成特定的时间序列数据。
可以使用date_range()方法来生成连续的时间序列。
需要注意的是,时间序列通常不是主动生成的,而是在记录事件发生的时间点时同步产生的。
ret = pd.date_range(
start='2021-10-1', # 开始点
# end='2022-1-1', # 结束点
periods=5, # 生成的元素的个数 和结束点只需要出现一个即可!
freq='W', # 生成数据的步长或者频率, W表示Week(星期)
)
print(ret)
"""
DatetimeIndex(['2021-10-03', '2021-10-10', '2021-10-17', '2021-10-24', '2021-10-31'],
dtype='datetime64[ns]', freq='W-SUN')
"""除了转换和生成,提取时间属性也是时间序列分析中的常见需求。
假设我们有一个初始数据框(类型为pandas.core.frame.DataFrame),其中包含时间列,我们可以从中提取各种时间属性。

# 转化为 pandas支持的时间序列之后再提取时间属性!
data.loc[:, 'time_list'] = pd.to_datetime(data.loc[:, 'time_list'])
# 可以通过列表推导式来获取时间属性
# 年月日
data['year'] = [tmp.year for tmp in data.loc[:, 'time_list']]
data['month'] = [tmp.month for tmp in data.loc[:, 'time_list']]
data['day'] = [tmp.day for tmp in data.loc[:, 'time_list']]
# 时分秒
data['hour'] = [tmp.hour for tmp in data.loc[:, 'time_list']]
data['minute'] = [tmp.minute for tmp in data.loc[:, 'time_list']]
data['second'] = [tmp.second for tmp in data.loc[:, 'time_list']]
# 日期
data['date'] = [tmp.date() for tmp in data.loc[:, 'time_list']]
# 时间
data['time'] = [tmp.time() for tmp in data.loc[:, 'time_list']]
print(data)
# 一年中的第多少周
data['week'] = [tmp.week for tmp in data.loc[:, 'time_list']]
# 一周中的第多少天
data['weekday'] = [tmp.weekday() for tmp in data.loc[:, 'time_list']]
# 季度
data['quarter'] = [tmp.quarter for tmp in data.loc[:, 'time_list']]
# 一年中的第多少周 ---和week是一样的
data['weekofyear'] = [tmp.weekofyear for tmp in data.loc[:, 'time_list']]
# 一周中的第多少天 ---和weekday是一样的
data['dayofweek'] = [tmp.dayofweek for tmp in data.loc[:, 'time_list']]
# 一年中第 多少天
data['dayofyear'] = [tmp.dayofyear for tmp in data.loc[:, 'time_list']]
# 周几 ---返回英文全拼
data['day_name'] = [tmp.day_name() for tmp in data.loc[:, 'time_list']]
# 是否为 闰年 ---返回bool类型
data['is_leap_year'] = [tmp.is_leap_year for tmp in data.loc[:, 'time_list']]
print('data:\n', data)
pandas提供了便捷的dt属性,用于访问datetime对象的各个组成部分。
利用dt属性,可以轻松地提取年、月、日、时、分、秒等时间要素。
data['year'] = data.loc[:, 'time_list'].dt.year
data['month'] = data.loc[:, 'time_list'].dt.month
data['day'] = data.loc[:, 'time_list'].dt.day
print('data:\n', data)
在时间序列分析中,计算时间间隔是一个重要环节。
# 计算时间间隔!
ret = pd.to_datetime('2022-3-9 10:08:00') - pd.to_datetime('2022-3-8')
print(ret) # 1 days 10:08:00
print(type(ret)) # <class 'pandas._libs.tslibs.timedeltas.Timedelta'>
print(ret.days) # 1通过计算两个时间点之间的推移,可以分析事件的时间跨度。
配合Timedelta()方法,可以精确计算时间推移量。
Timedelta支持多种参数,包括weeks(周)、days(天)、hours(小时)、minutes(分钟)、seconds(秒)、milliseconds(毫秒)、microseconds(微秒)和nanoseconds(纳秒)。
res = pd.to_datetime('2022-3-9 10:08:00') + pd.Timedelta(weeks=5)
print(res) # 2022-04-13 10:08:00
print(type(res)) # <class 'pandas._libs.tslibs.timestamps.Timestamp'>
print(pd.Timedelta(weeks=5)) # 35 days 00:00:00了解当前系统支持的最大和最小时间范围,有助于避免时间溢出错误。
# 获取当前机器的支持的最大时间和 最小时间
print('max :',pd.Timestamp.max)
print('min :',pd.Timestamp.min)
"""
max : 2262-04-11 23:47:16.854775807
min : 1677-09-21 00:12:43.145225
"""以上介绍了pandas中时间序列处理的主要技巧,希望能为读者提供有价值的参考。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













