目录
在线时间戳转换
在线计算转换时间戳:
可以看到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)
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()函数进行滚动窗口计算等。需要注意的是,这些函数默认使用的是本地时区的时间,如果需要在不同时区之间进行操作,需要先进行时区转换。