Pandas:解析 UNIX 时间戳时出现 ValueError

Pandas: ValueError parsing UNIX timestamp

提问人:ultra909 提问时间:8/30/2023 更新时间:8/31/2023 访问量:61

问:

我有一个 OHLC 数据的 CSV,自纪元以来按秒索引:tabulated CSV data

我是这样解析的:

df = pd.read_csv(f"{CSV}/{filename}", sep=",", header=0, index_col=0, parse_dates=['time'], date_format='s')

但是,时间戳不会解析为日期:

df.index

Index([ 378943200,  379548000,  380152800,  380757600,  381362400,  381967200,
        382572000,  383176800,  383781600,  384386400,
       ...
       1687726800, 1688331600, 1688936400, 1689541200, 1690146000, 1690750800,
       1691355600, 1691960400, 1692565200, 1693170000],
      dtype='int64', name='time', length=2172)

此外,如果我手动尝试将索引转换为日期时间,则会出现 ValueError:

pd.to_datetime(df.index, format='s', utc=True)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[71], line 1
----> 1 pd.to_datetime(df.index, format='s', utc=True)

...

ValueError: time data "378943200" doesn't match format "s", at position 0. You might want to try:
    - passing `format` if your strings have a consistent format;
    - passing `format='ISO8601'` if your strings are all ISO8601 but not necessarily in exactly the same format;
    - passing `format='mixed'`, and the format will be inferred for each element individually. You might want to use `dayfirst` alongside this.

这是根据 www.unixtimestamp.com 的 UNIX 时间戳值,那么是什么给出的呢?

python pandas datetime-format

评论

0赞 tadman 8/30/2023
您是否正在处理 1982 年的数据?解析时不确定是一回事。文档建议您应该在此处使用。%sorigin='unix'
0赞 ultra909 8/30/2023
这似乎是假设的,所以一切都是ns1970-01-01...
1赞 tadman 8/30/2023
文档确实解释了您可以使用 .unit='s'

答:

2赞 Tzane 8/30/2023 #1

您需要用 指定秒数,而不是unitformat

pd.to_datetime(df.index, unit='s', utc=True)

格式用于解析 strftime

测试 仪:

import pandas as pd

df = pd.DataFrame({"time": [ 378943200,  379548000,  380152800,  380757600,  381362400,  381967200,
        382572000,  383176800,  383781600,  384386400,]})

df["time_dt"] = pd.to_datetime(df["time"], unit="s", utc=True)
print(df.head(3))

# OUT
        time                   time_dt
0  378943200 1982-01-03 22:00:00+00:00
1  379548000 1982-01-10 22:00:00+00:00
2  380152800 1982-01-17 22:00:00+00:00

带read_csv的单行

由于在 pandas 2.0 中被弃用(由于性能原因?),他们建议改用 and。据我了解,由于 date_format 使用 strftime 解析并且没有 unix 时间的标志,因此没有“智能”方法可以做到这一点,因此使用 after 可能是要走的路(从 pandas 2.1.0 开始)。date_parserparse_datesdate_formatto_datetimeread_csv

话虽如此,您仍然可以传递列的自定义,但我不知道它与 after -method 相比具有什么样的性能convertersto_datetimeread_csv

import io
import datetime
import pandas as pd

csv_file = io.StringIO("time\n378943200\n379548000\n380152800\n")

df = pd.read_csv(csv_file, converters={"time": lambda s: datetime.datetime.utcfromtimestamp(int(s))})
print(df.time)

评论

0赞 ultra909 8/30/2023
这确实适用于.您知道在 2.0.x 中类似地工作的简写是什么吗?pd.to_datetimepd.read_csv
1赞 Tzane 8/31/2023
@ultra909 检查编辑
0赞 ultra909 8/31/2023
好吧,看起来他们可以收拾一下。已标记为答案。干杯。