【问题标题】:How to change timezone of a pandas dataframe columnin Python如何在 Python 中更改 pandas 数据框列的时区
【发布时间】:2022-01-18 12:14:50
【问题描述】:

我有以下代码在过去 5 年中创建纽约证券交易所的工作日表:

import pandas as pd
import datetime, pytz
import pandas_market_calendars as mcal

today_date = datetime.datetime.now(tz=pytz.timezone('US/Eastern'))
print(today_date)

start_date = datetime.date(today_date.year - 5, today_date.month, today_date.day)
print(start_date)

nyse_calender = mcal.get_calendar('NYSE')
print(nyse_calender.tz.zone)
nyse_business_days = nyse_calender.schedule(start_date=start_date, 
                                            end_date=today_date)

nyse_business_days

这是输出:

            market_open                 market_close
2017-01-18  2017-01-18 14:30:00+00:00   2017-01-18 21:00:00+00:00
2017-01-19  2017-01-19 14:30:00+00:00   2017-01-19 21:00:00+00:00
2017-01-20  2017-01-20 14:30:00+00:00   2017-01-20 21:00:00+00:00
2017-01-23  2017-01-23 14:30:00+00:00   2017-01-23 21:00:00+00:00
2017-01-24  2017-01-24 14:30:00+00:00   2017-01-24 21:00:00+00:00
...     ...     ...
2022-01-11  2022-01-11 14:30:00+00:00   2022-01-11 21:00:00+00:00
2022-01-12  2022-01-12 14:30:00+00:00   2022-01-12 21:00:00+00:00
2022-01-13  2022-01-13 14:30:00+00:00   2022-01-13 21:00:00+00:00
2022-01-14  2022-01-14 14:30:00+00:00   2022-01-14 21:00:00+00:00
2022-01-18  2022-01-18 14:30:00+00:00   2022-01-18 21:00:00+00:00

1260 rows × 2 columns

我实际上希望看到美国东部时区的时间,但事实并非如此。

例如,第一行的 ma​​rket_open 应该是 2017-01-18 09:30:00+00:00 但它显示的是 2017-01- 18 14:30:00+00:00。

我应该怎么做才能在美国/东部的两列中获取时区?它以 UTC 显示时区,但这不是我需要的。


附录:

我根据@IanKenney 的评论尝试了以下方法:

nyse_business_days["market_open"] = nyse_business_days["market_open"].tz_localize(pytz.utc).tz_convert(pytz.timezone('US/Eastern'))

当我把它打印出来时,我得到的是:

    market_open     market_close
2017-01-18  NaT     2017-01-18 21:00:00+00:00
2017-01-19  NaT     2017-01-19 21:00:00+00:00
2017-01-20  NaT     2017-01-20 21:00:00+00:00
2017-01-23  NaT     2017-01-23 21:00:00+00:00
2017-01-24  NaT     2017-01-24 21:00:00+00:00
...     ...     ...
2022-01-11  NaT     2022-01-11 21:00:00+00:00
2022-01-12  NaT     2022-01-12 21:00:00+00:00
2022-01-13  NaT     2022-01-13 21:00:00+00:00
2022-01-14  NaT     2022-01-14 21:00:00+00:00
2022-01-18  NaT     2022-01-18 21:00:00+00:00

1260 rows × 2 columns

【问题讨论】:

  • @IanKenney 我试过了,但不幸的是它并没有真正帮助。我在上面的问题中添加了更多信息。任何进一步的cmets..?
  • 由于您使用的是列(系列)而不是索引,因此请使用 dt 访问器:nyse_business_days["market_open"] = nyse_business_days["market_open"].dt.tz_localize(pytz.utc).dt.tz_convert(pytz.timezone('US/Eastern'))

标签: python python-3.x pandas datetime python-datetime


【解决方案1】:

您可以尝试以下方法来转换时区

nyse_business_days['market_open'] = [t.tz_convert(pytz.timezone('US/Eastern')) for t in nyse_business_days['market_open']]

【讨论】:

  • 成功了!比你好多了!
  • 如果你有dt accessor,为什么还要使用列表理解?
猜你喜欢
  • 1970-01-01
  • 2017-08-22
  • 2018-03-10
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 2022-08-14
相关资源
最近更新 更多