如何将熊猫中的日期时间列全部转换为同一时区

Posted

技术标签:

【中文标题】如何将熊猫中的日期时间列全部转换为同一时区【英文标题】:How can I convert my datetime column in pandas all to the same timezone 【发布时间】:2019-08-18 12:14:03 【问题描述】:

我有一个带有 DataTime 列的数据框(使用不同格式的时区)。似乎时区是 UTC,但我想将该列转换为 pd.to_datetime 并且失败了。那就是问题#1。由于失败了,我无法在时间段上执行任何日期时间操作,例如按日期对列进行分组/计算出日期/按小时分组等等。这是我的数据框df_res

    DateTime
    2017-11-02 19:49:28-07:00
    2017-11-27 07:32:22-08:00
    2017-12-27 17:01:15-08:00

命令的输出

      df_res["DateTime"] = df_res["DateTime"].dt.tz_convert('America/New_York')

AttributeError: Can only use .dt accessor with datetimelike values

当我转换为datetime

   df_res['DateTime'] = pd.to_datetime(df_res['DateTime'])

ValueError: Tz-aware datetime.datetime cannot be converted to datetime64 unless utc=True

我觉得我在兜圈子。我需要将列转换为 datetime 以执行操作&为了做到这一点,我需要让它们都处于相同的时区,但我不能拥有相同的时区,除非它是 datetime 对象,所以我怎样才能最好地解决这个问题。 我确实参考了以前的帖子,但它们似乎尽可能容易地转换为日期时间:

Convert datetime columns to a different timezone pandas Convert pandas timezone-aware DateTimeIndex to naive timestamp, but in certain timezone

【问题讨论】:

一开始你是如何创建“DateTime”列值的? 我从 json 文件中提取日期时间字段 【参考方案1】:

我认为没有必要应用 lambdas:

df_res['DateTime'] = pd.to_datetime(df_res['DateTime'], utc=True)

文档:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_datetime.html

【讨论】:

这只有在您的日期时间实际上是 UTC 时才有效,对吧? 这对我来说是非常有用的代码行。非常感谢【参考方案2】:

你可以检查一下:

df = pd.DataFrame(
    'time': [
        '2017-11-02 19:49:28-08:00', 
        '2017-11-27 07:32:22-07:00', 
        '2017-12-27 17:01:15-07:00'
    ]
)

df['time'] = pd.to_datetime(df['time'])

df['time'].apply(lambda x: pd.to_datetime(x).tz_localize('US/Eastern'))
0   2017-11-03 03:49:28-04:00
1   2017-11-27 14:32:22-05:00
2   2017-12-28 00:01:15-05:00
Name: time, dtype: datetime64[ns, US/Eastern]

【讨论】:

谢谢 .. 如果我的数据框有超过 10k+ 的日期时间条目怎么办。 DateTime 也是object 类型,我需要全部转换吗? @py_noob:对你来说可能太晚了,我遇到了同样的问题,转换为日期时间格式后,列的类型为object。但是,当我检查每一行时,它们都是日期时间格式。这很奇怪,但我认为这不是问题,不是吗? 就我而言,我需要将utf=True arg 传递给pd.to_datetime(),如df['time'] = pd.to_datetime(df['time'], utf=True)

以上是关于如何将熊猫中的日期时间列全部转换为同一时区的主要内容,如果未能解决你的问题,请参考以下文章

更改熊猫中日期时间列的时区并添加为分层索引

如何在熊猫中使用 read_csv 将时区感知日期时间作为时区天真的本地 DatetimeIndex 读取?

如何在熊猫中将列转换为一个日期时间列?

熊猫日期列中的不同格式 - 列与行的数据类型

如何在R中的数据框中转换日期/时间列

熊猫将带有年份整数的列转换为日期时间