首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在pandas.date_range中使用zoneinfo

在pandas.date_range中使用zoneinfo
EN

Stack Overflow用户
提问于 2022-12-02 20:31:38
回答 1查看 28关注 0票数 0

我正在尝试使用zoneinfo而不是pytz。我遇到了一个问题,使用zoneinfo启动日期并将其传递给pd.date_range

下面是使用pytzzoneinfo进行完全相同操作的一个示例。但是,当将它传递给pd.date_range时,后者会出现错误。

pytz示例:

代码语言:javascript
复制
start_date = datetime(2021, 1, 1, 0, 0, 0)end_date = datetime(2024, 1, 1, 0, 0, 0) # exclusive end range
代码语言:javascript
复制
pt = pytz.timezone('Canada/Pacific')start_date = pt.localize(start_date)end_date = pt.localize(end_date)
代码语言:javascript
复制
pd.date_range(start_date, end_date-timedelta(days=1), freq='d')

zoneinfo示例:

代码语言:javascript
复制
start_date1 = '2021-01-01 00:00:00
代码语言:javascript
复制
start_date1 = datetime.strptime(start_date1, '%Y-%m-%d %H:%M:%S').replace(microsecond=0, second=0, minute=0, tzinfo=ZoneInfo("America/Vancouver"))end_date1 = start_date1 + relativedelta(years=3)
代码语言:javascript
复制
pd.date_range(start_date1, end_date1-timedelta(days=1), freq='d')

然而,当使用zoneinfo时,我会得到以下错误:

代码语言:javascript
复制
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
~/Documents/GitHub/virtual/lib/python3.9/site-packages/pandas/_libs/tslibs/timezones.pyx in pandas._libs.tslibs.timezones.get_dst_info()

AttributeError: 'NoneType' object has no attribute 'total_seconds'

Exception ignored in: 'pandas._libs.tslibs.tzconversion.tz_convert_from_utc_single'
Traceback (most recent call last):
  File "pandas/_libs/tslibs/timezones.pyx", line 266, in pandas._libs.tslibs.timezones.get_dst_info
AttributeError: 'NoneType' object has no attribute 'total_seconds'
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
~/Documents/GitHub/virtual/lib/python3.9/site-packages/pandas/_libs/tslibs/timezones.pyx in pandas._libs.tslibs.timezones.get_dst_info()

AttributeError: 'NoneType' object has no attribute 'total_seconds'

Exception ignored in: 'pandas._libs.tslibs.tzconversion.tz_convert_from_utc_single'
Traceback (most recent call last):
  File "pandas/_libs/tslibs/timezones.pyx", line 266, in pandas._libs.tslibs.timezones.get_dst_info
AttributeError: 'NoneType' object has no attribute 'total_seconds'
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/var/folders/vp/7ptlp5l934vdh1lvmpgk4qyc0000gn/T/ipykernel_67190/3566591779.py in <module>
      5 end_date1 = start_date1 + relativedelta(years=3)
      6 
----> 7 pd.date_range(start_date1, end_date1-timedelta(days=1), freq='d')
      8 
      9 # Because certain distributions will be a result of combined distributions,

~/Documents/GitHub/virtual/lib/python3.9/site-packages/pandas/core/indexes/datetimes.py in date_range(start, end, periods, freq, tz, normalize, name, closed, **kwargs)
   1095         freq = "D"
   1096 
-> 1097     dtarr = DatetimeArray._generate_range(
   1098         start=start,
   1099         end=end,

~/Documents/GitHub/virtual/lib/python3.9/site-packages/pandas/core/arrays/datetimes.py in _generate_range(cls, start, end, periods, freq, tz, normalize, ambiguous, nonexistent, closed)
    450 
    451             if tz is not None and index.tz is None:
--> 452                 arr = tzconversion.tz_localize_to_utc(
    453                     index.asi8, tz, ambiguous=ambiguous, nonexistent=nonexistent
    454                 )

~/Documents/GitHub/virtual/lib/python3.9/site-packages/pandas/_libs/tslibs/tzconversion.pyx in pandas._libs.tslibs.tzconversion.tz_localize_to_utc()

~/Documents/GitHub/virtual/lib/python3.9/site-packages/pandas/_libs/tslibs/timezones.pyx in pandas._libs.tslibs.timezones.get_dst_info()

AttributeError: 'NoneType' object has no attribute 'total_seconds'

测试参数:

start_date==start_date1

end_date==end_date1两个测试的结果都是True

EN

回答 1

Stack Overflow用户

发布于 2022-12-02 22:09:24

如果正确理解,您希望使用ZoneInfo…创建一个日期范围(1Dfreq)如果正确的话,我看到你的代码发生了一些变化。

#1在处理datetimes时,请确保对象是正确的dtype。我相信datetime64格式会更好。

从提供代码中,我认为不需要‘strptime’或‘替换’。要访问ZoneInfo中的“美国/温哥华”,您可以将start_date1解析为几年、几个月、几天、几个小时和几分钟。

3解析start_date1时,可以添加3到年份(或其他数字)来创建结束日期。

以上内容将在指定的范围内创建一个DatetimeIndex。

吃饭总是很棘手的。和往常一样,您可以使用不同的路径(…)到达同一个目的地。这只是其中之一。

代码语言:javascript
复制
start_date_str = '2021-01-01 00:00:00'
start_date_datetime64 = pd.to_datetime(start_date_str) # change dtype  to datetime64

year = start_date_datetime64.year
month = start_date_datetime64.month
day = start_date_datetime64.day
hour = start_date_datetime64.hour
minute = start_date_datetime64.minute

start_date_formatted = dt.datetime(year, month, day, hour, minute, tzinfo=ZoneInfo("America/Vancouver"))
end_date_formatted = dt.datetime(year + 3, month, day, hour, minute, tzinfo=ZoneInfo("America/Vancouver"))

result = pd.date_range(start_date_formatted, end_date_formatted-pd.Timedelta(days=1), freq='d')

输出- DatetimeIndex,dtype='datetime64ns,America/温哥华‘,length=1095,freq='D')

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74661154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档