代码之家  ›  专栏  ›  技术社区  ›  binary_assemble

使用Pandas时如何将UNIX时间转换为Datetime。DataFrame.from_dict?

  •  0
  • binary_assemble  · 技术社区  · 7 月前

    我正在读取json数据文件并将其加载到字典中。它是关键:值如下。

    "1707195600000":1,"1707282000000":18,"1707368400000":1,"1707454800000":13,"1707714000000":18,"1707800400000":12,"1707886800000":155,"1707973200000":1"
    

    代码段:

    with open('data.json', 'r') as json_file:
        data_pairs = json.load(json_file)
    
    dataframe = pd.DataFrame.from_dict(data_pairs, orient='index')
    

    可以用 Pandas.DataFrame.from_dict ?或者我应该在使用之前将字典中的所有键都转换为数字 from_dict ?

    2 回复  |  直到 7 月前
        1
  •  1
  •   Mark Tolonen    7 月前

    您可以先转换密钥。它们似乎以毫秒为单位:

    import pandas as pd
    import datetime as dt
    
    data = {"1707195600000":1,"1707282000000":18,"1707368400000":1,"1707454800000":13,"1707714000000":18,"1707800400000":12,"1707886800000":155,"1707973200000":1}
    cvt_data = {dt.datetime.fromtimestamp(int(k) / 1000):v for k, v in data.items()}
    df = pd.DataFrame.from_dict(cvt_data, orient='index')
    print(df)
    

    输出:

                           0
    2024-02-05 21:00:00    1
    2024-02-06 21:00:00   18
    2024-02-07 21:00:00    1
    2024-02-08 21:00:00   13
    2024-02-11 21:00:00   18
    2024-02-12 21:00:00   12
    2024-02-13 21:00:00  155
    2024-02-14 21:00:00    1
    

    上面的代码将时间戳转换为不知道时区的本地时间,在我的例子中是太平洋标准时间(UTC-8)。以下转换为UTC时区感知日期时间。注意 +00:00 在输出中指示区域偏移:

    cvt_data = {dt.datetime.fromtimestamp(int(k) / 1000, tz=dt.UTC):v for k, v in data.items()}
    

    使用起来快得多 pd.to_datetime (在我的测试中约为6-7x),默认为该数据的tz无意识UTC转换。使用 utc=True 让它知道:

    df = pd.DataFrame.from_dict(data, orient='index')
    df.index = pd.to_datetime(df.index.astype(dtype='int64'), utc=True, unit='ms')
    

    输出(两个UTC版本):

                                 0
    2024-02-06 05:00:00+00:00    1
    2024-02-07 05:00:00+00:00   18
    2024-02-08 05:00:00+00:00    1
    2024-02-09 05:00:00+00:00   13
    2024-02-12 05:00:00+00:00   18
    2024-02-13 05:00:00+00:00   12
    2024-02-14 05:00:00+00:00  155
    2024-02-15 05:00:00+00:00    1
    
        2
  •  0
  •   natka_m    7 月前

    你可以使用Pandas to_datetime 转换索引。我还没有做任何基准测试,但我想当你有更多的数据时,它可能会更快:

    dataframe.index = pd.to_datetime(dataframe.index, unit="ms")
    # or
    dataframe.index = pd.to_datetime(dataframe.index.astype(dtype='int64'))
    

    注意:“解析字符串时,'to_datetime'与'unit'的行为已被弃用。”-因此,第二个选项,索引首先转换为int。