【问题标题】:Pandas to_datetime show time incorrect熊猫 to_datetime 显示时间不正确
【发布时间】:2013-09-19 11:52:07
【问题描述】:

我使用 pandas to_datetime 将 DataFrame 的时间戳格式化如下:

import pandas as pd
from pandas import *

d = {'TIMESTAMP' : Series([1294311545, 1294317813, 1294318449]),
          'PRICE' : Series([24990, 25499, 25499]),
          'VOLUME' : Series([1500000000, 5000000000, 100000000])}
df = DataFrame(d)
print df
df.TIMESTAMP = pd.to_datetime(df.TIMESTAMP, unit='s')
df.set_index('TIMESTAMP', inplace=True)       
print df
test = df['VOLUME'].resample('H', how='sum')
print test
test2= df['PRICE'].resample('H', how='ohlc')
print test2

输出1是:

   PRICE   TIMESTAMP      VOLUME
0  24990  1294311545  1500000000
1  25499  1294317813  5000000000
2  25499  1294318449   100000000
                     PRICE      VOLUME
TIMESTAMP                             
2011-01-06 10:59:05  24990  1500000000
2011-01-06 12:43:33  25499  5000000000
2011-01-06 12:54:09  25499   100000000

我第二次使用 python datetime 打印出上述 DataFrame 中的时间戳:

import datetime
print(datetime.datetime.fromtimestamp(int("1294311545")).strftime('%Y-%m-%d %H:%M:%S'))
print(datetime.datetime.fromtimestamp(int("1294317813")).strftime('%Y-%m-%d %H:%M:%S'))
print(datetime.datetime.fromtimestamp(int("1294318449")).strftime('%Y-%m-%d %H:%M:%S'))

输出2是:

2011-01-06 02:59:05
2011-01-06 04:43:33
2011-01-06 04:54:09

你会发现 output1 和 ouput2 是不一样的!这是时区问题吗?我需要输出 1 应该与输出 2 相同。以及如何解决?

【问题讨论】:

    标签: python numpy pandas scipy


    【解决方案1】:

    fromtimestamp本地化时间如果没有提供tz,你可以使用utcfromtimestamp来获取pandas做了什么(这里不本地化)

    In [22]: df.index[0]
    Out[22]: Timestamp('2011-01-06 10:59:05', tz=None)
    
    In [24]: datetime.datetime.utcfromtimestamp(int("1294311545")).strftime('%Y-%m-%d %H:%M:%S')
    Out[24]: '2011-01-06 10:59:05'
    
    In [25]: datetime.datetime.fromtimestamp(int("1294311545")).strftime('%Y-%m-%d %H:%M:%S')
    Out[25]: '2011-01-06 05:59:05'
    

    如果你想本地化tz,你可以这样做

    In [59]: df.index = df.index.tz_localize('Asia/Shanghai').tz_convert('UTC')
    
    In [60]: df
    Out[60]: 
                               PRICE      VOLUME
    TIMESTAMP                                   
    2011-01-06 02:59:05+00:00  24990  1500000000
    2011-01-06 04:43:33+00:00  25499  5000000000
    2011-01-06 04:54:09+00:00  25499   100000000
    

    【讨论】:

    • df.TIMESTAMP = pd.to_datetime(df.TIMESTAMP, unit='s') 这行对我来说是必须的,如何解决 pandas 和 DF 的时区问题?
    • 你的结果是UTC,你想用它做什么?你可以tz_localize,如果你愿意,见here
    • 我更新了我的帖子。我使用 pandas 进行金融 OHLC 流程,时间戳用作 DF 的索引。 pd.to_datetime(df.TIMESTAMP, unit='s') 对我的应用来说是必须的。
    • 这些纪元秒来自什么 tz?
    • 从数据库中查询TIMESTAMP并以JSON数据返回。没有提供 tz。
    猜你喜欢
    • 1970-01-01
    • 2016-07-08
    • 2017-07-18
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2022-01-14
    相关资源
    最近更新 更多