提问人:tamasgal 提问时间:1/20/2016 最后编辑:JJJtamasgal 更新时间:2/5/2021 访问量:77878
Pandas 将带有 unix 时间戳(以毫秒为单位)的行转换为 datetime
Pandas converting row with unix timestamp (in milliseconds) to datetime
问:
我需要处理大量的 CSV 文件,其中时间戳始终是表示 unix 时间戳的字符串(以毫秒为单位)。我还没有找到有效修改这些列的方法。
这就是我想出的,但这当然只复制了列,我必须以某种方式将其放回原始数据集。我敢肯定在创建 ?DataFrame
import sys
if sys.version_info[0] < 3:
from StringIO import StringIO
else:
from io import StringIO
import pandas as pd
data = 'RUN,UNIXTIME,VALUE\n1,1447160702320,10\n2,1447160702364,20\n3,1447160722364,42'
df = pd.read_csv(StringIO(data))
convert = lambda x: datetime.datetime.fromtimestamp(x / 1e3)
converted_df = df['UNIXTIME'].apply(convert)
这将选择列“UNIXTIME”并将其从
0 1447160702320
1 1447160702364
2 1447160722364
Name: UNIXTIME, dtype: int64
进入这个
0 2015-11-10 14:05:02.320
1 2015-11-10 14:05:02.364
2 2015-11-10 14:05:22.364
Name: UNIXTIME, dtype: datetime64[ns]
但是,我想使用类似的东西来获取与转换后的列一起返回的整个数据集,或者正如我已经写过的那样,只需在从 CSV 生成 DataFrame 时创建日期时间。pd.apply()
答:
3赞
tamasgal
1/20/2016
#1
我想出了一个解决方案:
convert = lambda x: datetime.datetime.fromtimestamp(float(x) / 1e3)
df = pd.read_csv(StringIO(data), parse_dates=['UNIXTIME'], date_parser=convert)
不过,我仍然不确定这是否是最好的。
104赞
EdChum
1/20/2016
#2
您可以使用 to_datetime
并传递 arg 将其作为后处理步骤来执行此操作:unit='ms'
In [5]:
df['UNIXTIME'] = pd.to_datetime(df['UNIXTIME'], unit='ms')
df
Out[5]:
RUN UNIXTIME VALUE
0 1 2015-11-10 13:05:02.320 10
1 2 2015-11-10 13:05:02.364 20
2 3 2015-11-10 13:05:22.364 42
评论
1赞
tamasgal
1/20/2016
啊,我完全错过了那个参数,谢谢,这是一个很好的参数!我将通过parse_dates提出拉取请求以将其包含在内。unit
.read_csv
0赞
Pengju Zhao
7/17/2017
由于时区问题,这可能会导致错误的时间。
0赞
EdChum
7/17/2017
@PengjuZhao OP的问题没有提到时区,因为Teudimundo的回答解决了这个问题
0赞
Pengju Zhao
7/18/2017
一个建议是,也许你可以尝试将 Teudimundo 的答案添加到你的答案中。这对像我这样的新手很有用。
0赞
EdChum
7/18/2017
@PengjuZhao蚕食其他用户的答案是一种不好的做法,我不这样做,但其他人会这样做。我认为只要它们足够明显,就可以使用多个答案
14赞
Teudimundo
2/20/2017
#3
我使用@EdChum解决方案,但我添加了时区管理:
df['UNIXTIME']=pd.DatetimeIndex(pd.to_datetime(pd['UNIXTIME'], unit='ms'))\
.tz_localize('UTC' )\
.tz_convert('America/New_York')
表示时间戳应被视为与“UTC”有关,然后实际上将日期/时间移动到正确的时区(在本例中为“America/New_York”)。tz_localize
tz_convert
请注意,它已转换为 a,因为这些方法仅适用于序列的索引。从 Pandas 0.15 开始,可以使用:DatetimeIndex
tz_
.dt
df['UNIXTIME']=pd.to_datetime(df['UNIXTIME'], unit='ms')\
.dt.tz_localize('UTC' )\
.dt.tz_convert('America/New_York')
评论
0赞
Marx Babu
5/24/2019
此方法最适合 雅虎时间戳转换 。第二个,而不是第一个。
0赞
Colin Miles
1/16/2020
同意,第二个在管理时区方面做得很好 - 正在获得跨日期的开始时间和结束时间的结果,这解决了这个问题(“美国/芝加哥”);观察语法,出现意外的行尾错误。
1赞
peter
11/19/2020
每个日期时间都包含一个“-05:00”附录,指示时区之间的时差(以小时为单位)。排除它的最佳方法是什么?
0赞
Teudimundo
11/19/2020
你所看到的 panda 如何显示值,列内部使用 datetime 类型。如果您希望有一个字符串,该字符串以您喜欢的格式表示日期时间,您可以使用 (pandas.pydata.org/pandas-docs/stable/reference/api/...),请注意结果是一系列字符串值。如果将其分配给同一列:您将无法再将列中的值用作日期时间,因为它们将是字符串。df['UNIXTIME'].dt.strftime(...)
df['UNIXTIME'] = df['UNIXTIME'].dt.strftime(...)
4赞
cs95
4/17/2019
#4
如果您知道时间戳单位,请使用:Series.astype
df['UNIXTIME'].astype('datetime64[ms]')
0 2015-11-10 13:05:02.320
1 2015-11-10 13:05:02.364
2 2015-11-10 13:05:22.364
Name: UNIXTIME, dtype: datetime64[ns]
要返回整个 DataFrame,请使用
df.astype({'UNIXTIME': 'datetime64[ms]'})
RUN UNIXTIME VALUE
0 1 2015-11-10 13:05:02.320 10
1 2 2015-11-10 13:05:02.364 20
2 3 2015-11-10 13:05:22.364 42
上一个:重新采样('W')奇怪的结果
评论