提问人:ultra909 提问时间:8/30/2023 更新时间:8/31/2023 访问量:61
Pandas:解析 UNIX 时间戳时出现 ValueError
Pandas: ValueError parsing UNIX timestamp
问:
我是这样解析的:
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 时间戳值,那么是什么给出的呢?
答:
2赞
Tzane
8/30/2023
#1
您需要用 指定秒数,而不是unit
format
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_parser
parse_dates
date_format
to_datetime
read_csv
话虽如此,您仍然可以传递列的自定义,但我不知道它与 after -method 相比具有什么样的性能converters
to_datetime
read_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_datetime
pd.read_csv
1赞
Tzane
8/31/2023
@ultra909 检查编辑
0赞
ultra909
8/31/2023
好吧,看起来他们可以收拾一下。已标记为答案。干杯。
评论
%s
origin='unix'
ns
1970-01-01...
unit='s'