【Python】Python时间戳转换

在线时间戳转换

在线计算转换时间戳
可以看到datetime 默认使用本地时区,1447344000对应的是北京时间2015-11-13 00:00:00;pd.to_datetime默认使用UTC时区,1447372800对应的是UTC时间2015-11-13 00:00:00
在这里插入图片描述
在这里插入图片描述

datetime的时间戳

from datetime import datetime
from pytz import timezone
tm = '2015-11-13 00:00:00'
stmp1 = datetime.strptime(tm, "%Y-%m-%d %H:%M:%S")
print(stmp1.timestamp())  # 输出:1447344000.0
# 指定时区,修改datetime的tzinfo属性
# 指定UTC时区
utc_dt = stmp1.replace(tzinfo=timezone("UTC"))
print(utc_dt.timestamp())  # 输出:1447372800.0
# 指定北京时区
bj_dt = stmp1.replace(tzinfo=timezone("Asia/Shanghai"))
print(bj_dt.timestamp())  # 输出:1447343640.0
# 转换时区为UTC时区
utc_dt_c = stmp1.astimezone(timezone("UTC"))
print(utc_dt_c.timestamp())  # 输出:1447344000.0
# 转换时区为北京时区
bj_dt_c = stmp1.astimezone(timezone("Asia/Shanghai"))
print(bj_dt_c.timestamp())  # 输出:1447344000.0

可以看到,replace(tzinfo=timezone(“UTC”)) 和 .astimezone(timezone) 的区别是:
replace(tzinfo=timezone(“UTC”)) 只是修改 datetime 对象的 tzinfo 属性,不会修改日期和时间的值。这样做可能会导致不正确的时间戳或时区转换。
astimezone(timezone) 会根据时区的规则,调整日期和时间的值,使得时间戳保持不变。这样做可以正确地转换时区。
所以,建议使用 astimezone(timezone) 来指定或转换时区。

如果原始stmp1的tzinfo是(“Asia/Shanghai”),为什么bj_dt = stmp1.replace(tzinfo=timezone(“Asia/Shanghai”)),bj_dt和stmp1的时间戳不一致

这是因为 replace() 方法不会转换时区,只会修改 tzinfo 属性。如果原始 stmp1 的 tzinfo 是 (“Asia/Shanghai”),那么它的时间戳是根据北京时间计算的。如果你用 replace() 方法创建一个新的 datetime 对象 bj_dt,指定时区也是 (“Asia/Shanghai”),那么它的时间戳是根据 UTC 时间计算的,然后加上时区的偏移量。所以,两个对象的时间戳不一致。
如果你想让两个对象的时间戳一致,你可以用 astimezone() 方法来转换时区,或者用 replace() 方法来移除时区。

numpy时间戳

numpy.datetime64时间转换为 datetime.datetime

直接使用astype(datetime.datetime)方法,可能返回为整形

In: np.datetime64('2012-06-18T02:00:05.453000000-0400').astype(datetime.datetime)
Out: 1339999205453000000L

查看numpy源码测试文件 https://github.com/numpy/numpy/blob/master/numpy/core/tests/test_datetime.py
在这里插入图片描述

可以尝试这样转换:

In [296]:x=np.datetime64('2012-06-18T02:00:05.453000000-0400').astype(datetime.datetime)
In [296]: x.astype('M8[D]').astype('O')
Out[296]: datetime.date(2012, 6, 18)

In [297]: x.astype('M8[ms]').astype('O')
Out[297]: datetime.datetime(2012, 6, 18, 6, 0, 5, 453000)

In [303]: np.array([[x,x],[x,x]],dtype='M8[ms]').astype('O')[0,1]
Out[303]: datetime.datetime(2012, 6, 18, 6, 0, 5, 453000)

构建了一个pandas数组df1:
在这里插入图片描述
通过datetime.timedelta,遍历缺失项

dtime = datetime.datetime(2018, 6, 4, 8, 0, 0)
dtime = (df1[-2:-1])['时间'].values[0]
dtime = dtime.astype('M8[s]').astype('O')
dtime = dtime + datetime.timedelta(minutes=5)

参考链接:
https://stackoverflow.com/questions/29753060/how-to-convert-numpy-datetime64-into-datetime

sqlite时间戳

创建sqlite数据表时,添加数据更新的时间戳,并设置为当地时区

CREATE TABLE tablename (
  ID INTEGER PRIMARY KEY,
  column1 TEXT,
  column2 REAL,
  timestamp DATETIME DEFAULT (datetime('now', 'localtime'))
);

datetime与pd.to_datetime输出的时间戳不一样

为什么输出时间戳的值不一样,一个是1447344000,一个是1447372800,怎么让他们输出一样的值。

from datetime import datetime
import pandas as pd
tm = '2015-11-13 00:00:00'
stmp1 = datetime.strptime(tm, "%Y-%m-%d %H:%M:%S")
stmp2 = pd.to_datetime(tm)
print(stmp1.timestamp())
print(stmp2.timestamp())
## output
## 1447344000
## 1447372800

原因

当时间字符串不包含时区信息时,
Python中的datetime模块默认使用本地时区,因为它是基于系统的时间设置来创建和处理日期和时间对象的Pandas中的时间序列默认使用UTC时区,因为它是一个国际标准,可以避免夏令时和其他地区性的问题如果你想在Pandas中转换时区,你可以使用tz_localize和tz_convert方法。

使用带时区的时间字符串

from datetime import datetime
import pandas as pd
tm = '2015-11-13 00:00:00+08:00'
stmp1 = datetime.strptime(tm, "%Y-%m-%d %H:%M:%S%z")
stmp2 = pd.to_datetime(tm)
print(stmp1.timestamp())  # 输出:1447344000.0
print(stmp2.timestamp())     # 输出:1447344000.0

指定或修改datetime的时区

修改datetime的时间戳

from datetime import datetime
import pandas as pd
tm = '2015-11-13 00:00:00'
stmp1 = datetime.strptime(tm, "%Y-%m-%d %H:%M:%S")
stmp2 = pd.to_datetime(tm)

stmp1_pd = pd.Timestamp(stmp1, tz='UTC')
print(stmp1_pd.timestamp())  # 输出:1447372800.0
print(stmp2.timestamp())     # 输出:1447372800.0

指定pandas的时区为Asia/Shanghai时间

使用pd.Series.dt.tz_localize方法将日期时间数据本地化为目标时区。使用pd.Series.dt.tz_convert方法将日期时间数据从一种时区转换为另一种时区。

from datetime import datetime
import pandas as pd
tm = '2015-11-13 00:00:00'
stmp1 = datetime.strptime(tm, "%Y-%m-%d %H:%M:%S")
# 生成当前时间的时间戳,不指定时区
stmp2  = pd.Timestamp(tm, tz='Asia/Shanghai')
print(stmp1.timestamp())  # 输出:1447344000.0
print(stmp2.timestamp())     # 输出:1447344000.0

或者

from datetime import datetime
import pandas as pd
tm = '2015-11-13 00:00:00'
stmp1 = datetime.strptime(tm, "%Y-%m-%d %H:%M:%S")
# 生成当前时间的时间戳,不指定时区
stmp2  = pd.to_datetime(tm).tz_localize('Asia/Shanghai')
print(stmp1.timestamp())  # 输出:1447344000.0
print(stmp2.timestamp())     # 输出:1447344000.0

3.4 整列时间戳转换为北京时间

    df['tmt']= pd.to_datetime(df['stamp'], unit='s', origin=pd.Timestamp('1970-01-01')).dt.tz_localize('Asia/Shanghai')
    df['tm'] = df['tmt'].dt.strftime('%Y-%m-%d %H:%M:%S')

时间格式转换:可以使用pd.to_datetime()函数将字符串或数字转换为时间格式,例如pd.to_datetime(‘2022-01-01’)。如果需要指定时间格式,可以使用format参数,例如pd.to_datetime(‘2022-01-01’, format=‘%Y-%m-%d’)。

时区转换:可以使用tz_localize()函数将时间列本地化为某个时区,例如df[‘time’].dt.tz_localize(‘UTC’)。然后使用tz_convert()函数将其转换为另一个时区,例如df[‘time’].dt.tz_convert(‘Asia/Shanghai’)。

时间差计算:可以使用pd.Timedelta()函数计算两个时间之间的差值,例如pd.Timedelta(days=1)表示一天的时间差。也可以使用pd.DateOffset()函数进行更灵活的时间偏移计算,例如pd.DateOffset(months=3)表示三个月后的时间。

时间序列操作:pandas提供了丰富的时间序列操作函数,例如resample()函数对时间序列进行重采样,rolling()函数进行滚动窗口计算等。需要注意的是,这些函数默认使用的是本地时区的时间,如果需要在不同时区之间进行操作,需要先进行时区转换。

### 时间与时间戳之间的转换Python 中,可以利用 `datetime` 和 `time` 模块来实现时间和时间戳之间的相互转换。以下是具体方法: #### 将时间戳转换为日期对象 可以通过 `datetime.datetime.fromtimestamp()` 方法将 Unix 时间戳(单位为秒)转换为本地时间的日期对象。 ```python import datetime timestamp = 1609459200 # 示例时间戳 date_object = datetime.datetime.fromtimestamp(timestamp) print(date_object) # 输出格式化后的日期和时间 ``` 上述代码展示了如何通过给定的时间戳创建对应的日期对象[^1]。 #### 将日期对象转换时间戳 如果有一个日期对象并希望将其转换时间戳,则可使用 `datetime.timestamp()` 方法。 ```python date_obj = datetime.datetime(2021, 1, 1) timestamp = date_obj.timestamp() print(timestamp) # 打印对应的时间戳 ``` 此部分说明了如何从日期对象获取相应的时间戳。 #### 使用 `time` 模块处理时间戳 除了 `datetime` 外,`time` 模块也提供了多种方式用于操作时间戳。例如,可以用 `time.localtime()` 或 `time.gmtime()` 来解析时间戳成结构化的元组形式;或者用 `time.mktime()` 反向构建时间戳。 ```python import time # 转换时间戳到本地时间元组 local_time_tuple = time.localtime(1609459200) # 构建新的时间戳 mktime_example = time.mktime(local_time_tuple) print(mktime_example) ``` 这里解释了另一种途径来进行时间戳的相关运算[^2]。 #### 数据集中涉及的时间戳应用实例 对于实际应用场景中的例子,在推荐系统的数据加载过程中会遇到带有时间戳字段的数据表。这些时间戳通常记录的是用户行为发生的具体时刻,便于后续分析模型考虑时间因素的影响。 ```python import pandas as pd r_cols = ['user_id', 'movie_id', 'rating', 'unix_timestamp'] ratings_train = pd.read_csv('ml-100k/ua.base', sep='\t', names=r_cols, encoding='latin-1') ratings_test = pd.read_csv('ml-100k/ua.test', sep='\t', names=r_cols, encoding='latin-1') # 查看前几条数据确认读取成功与否 print(ratings_train.head()) ``` 以上片段演示了一个典型场景下怎样导入含时间戳列的数据文件,并初步观察其内容[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KmBase

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值