字符串转换为datetime timezon

2024-06-09 07:09:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在两个时间串之间线性插值一些点。在

所以我试着把字符串转换成日期时间,然后插入一些点,然后把日期时间转换成字符串。但时区似乎不正确。在

在下面的例子中。我想在9-28 11:07:57.435”和“9-28 12:00:00.773”之间插入一点。在

#!/usr/bin/env python
import numpy as np
from time import mktime
from datetime import datetime

#-----------------------------------------#
def main():
    dtstr = [
"9-28 11:07:57.435",
"9-28 12:00:00.773"
]
    print "input",dtstr
    dtlst = str2dt(dtstr)
    floatlst = dt2float(dtlst)

    bins = 3
    x1 = list(np.arange(floatlst[0],floatlst[-1],(floatlst[-1]-floatlst[0])/bins))
    dtlst = float2dt(x1)
    dtstr = dt2str(dtlst)
    print "output",dtstr
    return

def str2dt(strlst):
    dtlst = [datetime.strptime("2014-"+i, "%Y-%m-%d %H:%M:%S.%f") for i in strlst]
    return dtlst

def dt2float(dtlst):
    floatlst = [mktime(dt.timetuple()) for dt in dtlst]
    return floatlst

def dt2str(dtlst):
    dtstr = [dt.strftime("%Y-%m-%d %H:%M:%S %Z%z") for dt in dtlst]
    return dtstr

def float2dt(floatlst):
    dtlst = [datetime.utcfromtimestamp(seconds) for seconds in floatlst]
    return dtlst

#-----------------------------------------#
if __name__ == "__main__":
    main()

输出如下:

^{pr2}$

这里有两个问题:

  1. 输入和输出相差4小时(9-28 16:07:57到9-28 11:07:57)。我想是时区造成的,但不知道怎么解决。在
  2. 我希望第一个和最后一个点与输入相同,但现在看来最后一个点比输入最后一个点(16:42:39 vs 12:00:00)要小。在

Tags: 字符串infromimportfordatetimereturnmain
1条回答
网友
1楼 · 发布于 2024-06-09 07:09:23

问题1。你对时区的看法是对的,你使用的是time.mktime,它是converts struct_time to seconds assuming the input is local time,但是使用的是{a2}(自然地)转换为utc。请改用^{}将所有内容保留在本地时间内。在

问题2。与本机Python range/xrange一样,当您numpy.arange(x, y, z)时,结果以x开头并向上延伸,但不包括yexcept in weird floating point roundoff cases.不要依赖于此行为)。如果您想在带有浮点值的端点上保持一致的行为,请使用numpy.linspace

另一方面,为什么要将日期时间转换为秒,然后再返回呢?datetime对象支持加法和减法。下面是我的建议。在

from time import mktime, localtime
from datetime import datetime
from copy import copy

def main():
    input_timestrings = ["9-28 11:07:57.435", "9-28 12:00:00.773"]
    input_datetimes = timestrings_to_datestimes(input_timestrings)

    start_datetime = input_datetimes[0]
    end_datetime = input_datetimes[1]

    # subtraction between datetime objects returns a timedelta object
    period_length = end_datetime - start_datetime

    bins = 3

    # operation w/ timedelta objects and datetime objects work pretty much as you'd expect it to
    delta = period_length / bins
    datetimes = list(custom_range(start_datetime, end_datetime + delta, delta))
    output_timestrings = datetimes_to_timestrings(datetimes)

    print output_timestrings
    return

def timestrings_to_datetimes(timestrings):
    datetimes = [datetime.strptime("2014-"+timestring, "%Y-%m-%d %H:%M:%S.%f") for timestring in timestrings]
    return datetimes

def datetimes_to_timestrings(datetimes):
    timestrings = [datetime_.strftime("%Y-%m-%d %H:%M:%S %Z%z") for datetime_ in datetimes]
    return timestrings

def custom_range(start, end, jump):
    x = start
    while x < end:
        yield x
        x = x + jump


if __name__ == "__main__":
    main()

相关问题 更多 >