Pandas 将带有 unix 时间戳(以毫秒为单位)的行转换为 datetime

Pandas converting row with unix timestamp (in milliseconds) to datetime

提问人:tamasgal 提问时间:1/20/2016 最后编辑:JJJtamasgal 更新时间:2/5/2021 访问量:77878

问:

我需要处理大量的 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()

Python 熊猫 日期时间

评论


答:

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_localizetz_convert

请注意,它已转换为 a,因为这些方法仅适用于序列的索引。从 Pandas 0.15 开始,可以使用:DatetimeIndextz_.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