Python 3.x 在Python3中将时间戳浮点转换为日期时间

Python 3.x 在Python3中将时间戳浮点转换为日期时间,python-3.x,datetime,Python 3.x,Datetime,我将时间戳作为浮点数,希望将其转换为datetime对象。 例子: 20050101.47916667将是时间2005-01-01 11:30:00 使用代码: import datetime print(datetime.datetime.fromtimestamp(20050101.47916667)) 输出结果: 1970-08-21 02:28:21.479167 如何将我的浮动转换为正确的日期时间 编辑:我的完整代码如下所示,因为我正在尝试创建一个在x轴上日期格式正确的timese

我将时间戳作为浮点数,希望将其转换为datetime对象。 例子: 20050101.47916667将是时间2005-01-01 11:30:00

使用代码:

import datetime
print(datetime.datetime.fromtimestamp(20050101.47916667))
输出结果:

1970-08-21 02:28:21.479167
如何将我的浮动转换为正确的日期时间

编辑:我的完整代码如下所示,因为我正在尝试创建一个在x轴上日期格式正确的timeseries:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import matplotlib.colors as mcolors
from datetime import datetime, timedelta
from netCDF4 import Dataset
import numpy as np

fig,axs = plt.subplots(2,1,squeeze=True)

a = Dataset('control1.nc')
a2 = Dataset('affor1.nc')
a3 = Dataset('control2.nc')
a4 = Dataset('affor2.nc')

my_time = a.variables['Times'][:]   
V10 = a.variables['V10'][:,0,0]

my_time2 = a2.variables['Times'][:]
V10_2 = a2.variables['V10'][:,0,0]

my_time3 = a3.variables['Times'][:]
V10_3 = a3.variables['V10'][:,0,0]

my_time4 = a4.variables['Times'][:]
V10_4 = a4.variables['V10'][:,0,0]

x1 = my_time
x2 = my_time2
x3 = my_time3
x4 = my_time4
y1 = V10
y2 = V10_2
y3 = V10_3
y4 = V10_4

axs[0].plot(x1,y1, marker='', color='red', linewidth=1, label='Control WGP2')
axs[0].plot(x2,y2, marker='', color='blue', linewidth=1, label='Afforestation WGP2')
axs[1].plot(x3,y3, marker='', color='magenta', linewidth=1, label='Control WGP4')
axs[1].plot(x4,y4, marker='', color='black', linewidth=1, label='Afforestation WGP4')

axs[0].legend()
axs[1].legend()
axs[0].set_title('January 2005',loc='center')
axs[0].set_xlabel('Date')
axs[1].set_xlabel('Date')
axs[0].set_ylabel('Wind gusts (m/s)')
axs[1].set_ylabel('Wind gusts (m/s)')

for ax in axs.flat:
    ax.label_outer()

plt.show()
两个变量(V10和time)都是数组,例如: [20050101.47916667 20050102.47916667 20050103.47916667 20050104.47916667 20050105.47916667 20050106.47916667 20050107.47916667 20050108.47916667 20050109.47916667 20050110.47916667 20050111.47916667 20050112.47916667 20050113.47916667 20050114.47916667 20050115.47916667 20050116.47916667 20050117.47916667 20050118.47916667 20050119.47916667 20050120.47916667 20050121.47916667 20050122.47916667 20050123.47916667 20050124.47916667 20050125.47916667 20050126.47916667 20050127.47916667 20050128.47916667 20050129.47916667 20050130.47916667 20050131.47916667]

日期。fromtimestamp()
需要POSIX时间戳,如python中所述。我以前从未见过的浮点时间戳格式,您可能需要手动解析

编辑: 您可以通过将时间戳转换为
int
,然后转换为
字符串
str(int(timestamp))
来解析
年-月-日。从这里开始,您所要做的就是将字符串重新格式化为您想要的任何格式。我想小数部分是一天的零头?如果是这种情况,一些简单的代数可以将其转换为24小时时间。

日期。fromtimestamp()
需要POSIX时间戳,如python中所述。我以前从未见过的浮点时间戳格式,您可能需要手动解析

编辑:
您可以通过将时间戳转换为
int
,然后转换为
字符串
str(int(timestamp))
来解析
年-月-日。从这里开始,您所要做的就是将字符串重新格式化为您想要的任何格式。我想小数部分是一天的零头?如果是这种情况,一些简单的代数可以将其转换为24小时时间。

您可以将小数分隔符之前的部分解析为
datetime
对象,并将日分数添加为
timedelta

from datetime import datetime, timedelta

f = 20050101.47916667
dtobj = datetime.strptime(str(int(f)), '%Y%m%d') + timedelta(days=f-int(f))
# datetime.datetime(2005, 1, 1, 11, 30, 0, 429)
如果必须转换这些浮动的列表,可以将其作为函数并使用列表理解:

def flt_2_dtobj(f):
    return datetime.strptime(str(int(f)), '%Y%m%d') + timedelta(days=f-int(f))

l = [20050101.47916667, 20050102.47916667, 20050103.47916667]

l_dt = [flt_2_dtobj(f) for f in l]

# [datetime.datetime(2005, 1, 1, 11, 30, 0, 429),
#  datetime.datetime(2005, 1, 2, 11, 30, 0, 429),
#  datetime.datetime(2005, 1, 3, 11, 30, 0, 429)]

您可以将小数分隔符之前的部分解析为
datetime
对象,并将日分数添加为
timedelta

from datetime import datetime, timedelta

f = 20050101.47916667
dtobj = datetime.strptime(str(int(f)), '%Y%m%d') + timedelta(days=f-int(f))
# datetime.datetime(2005, 1, 1, 11, 30, 0, 429)
如果必须转换这些浮动的列表,可以将其作为函数并使用列表理解:

def flt_2_dtobj(f):
    return datetime.strptime(str(int(f)), '%Y%m%d') + timedelta(days=f-int(f))

l = [20050101.47916667, 20050102.47916667, 20050103.47916667]

l_dt = [flt_2_dtobj(f) for f in l]

# [datetime.datetime(2005, 1, 1, 11, 30, 0, 429),
#  datetime.datetime(2005, 1, 2, 11, 30, 0, 429),
#  datetime.datetime(2005, 1, 3, 11, 30, 0, 429)]

.47916667
的一天分数是~11:30,而不是10:30?啊,你说得对,那是个打字错误:)47916667
的一天分数是~11:30,不是10:30?啊,你说得对,那是个打字错误:)我想这就是我找不到答案的原因;-)你的答案有我的答案缺失的答案:)我想这就是我的答案缺失的原因;-)你的答案中有一个答案,我找不到:)@ElsRi:好的,太好了!编辑了如何将其应用于列表,以防万一;-)还有一个问题,我的数据在一个数组中:[20050101.47916667 20050102.47916667 20050103.47916667 20050104.47916667 20050105.47916667 20050106.47916667 20050107.47916667 20050108.47916667 20050109.47916667 20050110.47916667 20050111.47916667 20050112.47916667 20050113.47916667 20050114.47916667 20050116.47916667]我曾尝试使用您的列表解决方案将所有时间步转换为新格式,但无法将新的日期时间保存在类似的数组中,以便在时间序列图中使用。我应该如何调整代码使之成为可能?@ElsRi:你说的数组是什么意思<代码>numpy.ndarray
<代码>熊猫系列
?您希望如何创建时间序列图
matplotlib.pyplot
?我对主要问题进行了编辑,以显示编辑之前的内容,也许这会清楚地说明我在尝试什么do@ElsRi好的,也许你可以直接使用num2date,@ElsRi:好的,太好了!编辑了如何将其应用于列表,以防万一;-)还有一个问题,我的数据在一个数组中:[20050101.47916667 20050102.47916667 20050103.47916667 20050104.47916667 20050105.47916667 20050106.47916667 20050107.47916667 20050108.47916667 20050109.47916667 20050110.47916667 20050111.47916667 20050112.47916667 20050113.47916667 20050114.47916667 20050116.47916667]我曾尝试使用您的列表解决方案将所有时间步转换为新格式,但无法将新的日期时间保存在类似的数组中,以便在时间序列图中使用。我应该如何调整代码使之成为可能?@ElsRi:你说的数组是什么意思<代码>numpy.ndarray
<代码>熊猫系列
?您希望如何创建时间序列图
matplotlib.pyplot
?我对主要问题进行了编辑,以显示编辑之前的内容,也许这会清楚地说明我在尝试什么do@ElsRi好的,也许你可以直接使用num2date,