我的传入字符串是时区感知的UTC格式,例如:
'2014-11-25 01:01:00+00:00'
并希望在原生本地化时区显示此信息 - 最后没有UTC偏移位。
例如,上面的示例,对于US / Eastern应显示为: '2014-11-24 20:01:00'
现在,我已经制作了一个带有输入字符串的方法,然后执行此操作,吐出我想要的值。然而,它似乎非常低效。我正在使用pandas进行数据操作,并且此方法以上述字符串格式应用于整列时间序列字符串数据。通过交互式shell调用apply方法在~2秒内完成执行,但奇怪的是,让代码在同一数据帧上运行编译/解释需要15-20秒。这是为什么?这就是我为数据帧/系列调用它的方式:
df['created_at'] = df['created_at'].apply(timeremap)
我是自学成才的显然不是最好的程序员。请告诉我我可以做些什么来简化这个过程。从谷歌搜索来看,似乎有5000种方法可以在python中转换时间。我对任何模块/包都开放,但最好是希望在现有的股票python或pandas中完成。这样做的“正确方法”是什么?
这是我的小涂鸦:
from pandas.tseries.tools import parse_time_string
from pytz import timezone
import calendar
import datetime
def timeremap(intimestr, tz=timezone('US/Eastern')):
temp = parse_time_string(intimestr)[0]
loc = temp.astimezone(tz)
return str(dt(ut(loc)))
def dt(u):
return datetime.datetime.utcfromtimestamp(u)
def ut(d):
return calendar.timegm(d.timetuple())
答案 0 :(得分:0)
如果给你一个csv文件,其中包含按时间索引的数据:
time,value
2015-11-01 08:30:00+03:00,0
2015-11-01 08:45:00+03:00,1
2015-11-01 09:00:00+03:00,2
2015-11-01 09:15:00+03:00,3
2015-11-01 09:30:00+03:00,4
2015-11-01 09:45:00+03:00,5
2015-11-01 10:00:00+03:00,6
2015-11-01 10:15:00+03:00,7
您可以使用read_csv()
来读取它并解析时间字符串,并使用tz_convert()
将输入转换为目标时区:
#!/usr/bin/env python
import sys
import pandas
import pytz
filename = 'dataframe'
local_tz = pytz.timezone('America/New_York')
df = pandas.read_csv(filename, parse_dates=True, index_col=0)
df.index = df.index.tz_localize(pytz.utc).tz_convert(local_tz)
df.head().to_csv(sys.stdout)
df.head().to_csv(sys.stdout, date_format='%Y-%m-%d %H:%M:%S')
这里的每个索引值最初存储为utc时间,没有关联的时区(转换前):
print(repr(df.index[0]))
# -> Timestamp('2015-11-01 05:30:00', tz=None)
或者你可以在阅读时转换时间:
from dateutil.parser import parse
def parse_datetime(time_string, tz=local_tz):
return tz.normalize(parse(time_string).astimezone(tz))
df = pandas.read_csv(filename, date_parser=parse_datetime, index_col=0)
df.head().to_csv(sys.stdout)
df.head().to_csv(sys.stdout, date_format='%Y-%m-%d %H:%M:%S')
这里的每个索引值都有相关的时区:
print(repr(df.index[0]))
# -> Timestamp('2015-11-01 01:30:00-0400', tz='America/New_York')
time,value
2015-11-01 01:30:00-04:00,0
2015-11-01 01:45:00-04:00,1
2015-11-01 01:00:00-05:00,2
2015-11-01 01:15:00-05:00,3
2015-11-01 01:30:00-05:00,4
time,value
2015-11-01 01:30:00,0
2015-11-01 01:45:00,1
2015-11-01 01:00:00,2
2015-11-01 01:15:00,3
2015-11-01 01:30:00,4
两种方法都产生相同的输出。
注意:如何date_format
用于“抛弃”消除时间字符串歧义的utc偏移量(2015年11月1日在美国/纽约时区有DST过渡结束)。