繁体   English   中英

将 `pandas` 频率字符串转换为 `DateOffset`

Convert `pandas` frequency string to `DateOffset`

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个时区感知pandas DateTimeIndex ,我想提前一个时间步长,时间步长由其.freq属性指定。 但是,这样做不尊重时区信息:

import pandas as pd
i = pd.date_range('2020-03-28', freq='D', periods=3, tz='Europe/Amsterdam')
# DatetimeIndex(['2020-03-28 00:00:00+01:00', '2020-03-29 00:00:00+01:00',
#                '2020-03-30 00:00:00+02:00'],
#               dtype='datetime64[ns, Europe/Amsterdam]', freq='D')

i + i.freq
# Not what I want; second timestamp is advanced by 24h instead of 23h and is no longer at midnight:
# DatetimeIndex(['2020-03-29 00:00:00+01:00', '2020-03-30 01:00:00+02:00',
#                '2020-03-31 00:00:00+02:00'],
#               dtype='datetime64[ns, Europe/Amsterdam]', freq='D')

什么工作用的就是pd.DateOffset

i + pd.DateOffset(days=1)
# What I want; all timestamps at midnight (I just need to re-set the .freq attribute):
# DatetimeIndex(['2020-03-29 00:00:00+01:00', '2020-03-30 00:00:00+02:00',
#                '2020-03-31 00:00:00+02:00'],
#               dtype='datetime64[ns, Europe/Amsterdam]', freq=None)

但是,由于我事先不知道索引的频率是多少,我想使用i.freq的值来获得正确的DateOffset 有没有办法做到这一点? (除了使用 long if... elif... elif...块。)

当然,也欢迎其他解决方案。

是我发现的唯一与此相关的其他问题,但我不能在这里使用它:

i + pd.tseries.frequencies.to_offset(i.freq)
# Not what I want:
# DatetimeIndex(['2020-03-29 00:00:00+01:00', '2020-03-30 01:00:00+02:00',
#                '2020-03-31 00:00:00+02:00'],
#               dtype='datetime64[ns, Europe/Amsterdam]', freq='D')

(实际上,后一项返回的正好是i.freq 。)

非常感谢。

编辑 (1)

正如评论中所建议的,在某些情况下使用.shift(1)有效,包括在我上面陈述的情况下......

i.shift(1)
# What I want; all timestamps at midnight:
# DatetimeIndex(['2020-03-29 00:00:00+01:00', '2020-03-30 00:00:00+02:00',
#                '2020-03-31 00:00:00+02:00'],
#               dtype='datetime64[ns, Europe/Amsterdam]', freq='D')

……但并非全部。 事实上,将我原始索引中的开始日期提前一天会导致时间戳被删除,其余的都是错误的:

i2 = pd.date_range('2020-03-29', freq='D', periods=3, tz='Europe/Amsterdam')
# DatetimeIndex(['2020-03-29 00:00:00+01:00', '2020-03-30 00:00:00+02:00',
#               '2020-03-31 00:00:00+02:00'],
#              dtype='datetime64[ns, Europe/Amsterdam]', freq='D')

i2.shift(1)
# Not what I want: timestamps not at midnight, and one got dropped!
# DatetimeIndex(['2020-03-30 01:00:00+02:00', '2020-03-31 01:00:00+02:00'],
#               dtype='datetime64[ns, Europe/Amsterdam]', freq='D')

编辑 (2)

作为由@MrFruppes的回答表明,使用.nanos的属性i.freq可以作为输入pd.DateOffset ...

i + pd.DateOffset(nanoseconds=i.freq.nanos)
# What I want; all timestamps at midnight (I just need to re-set the .freq attribute):
# DatetimeIndex(['2020-03-29 00:00:00+01:00', '2020-03-30 00:00:00+02:00',
#                '2020-03-31 00:00:00+02:00'],
#               dtype='datetime64[ns, Europe/Amsterdam]', freq=None)

...但是当我们尝试推进到下个月初时它会中断:

i3 = pd.date_range('2020-03-01', freq='MS', periods=3, tz='Europe/Amsterdam')
# DatetimeIndex(['2020-03-01 00:00:00+01:00', '2020-04-01 00:00:00+02:00',
#                '2020-05-01 00:00:00+02:00'],
#               dtype='datetime64[ns, Europe/Amsterdam]', freq='MS')

i3 + pd.DateOffset(nanoseconds=i3.freq.nanos)
Traceback (most recent call last):

  File "<ipython-input-58-f3a32c654a6e>", line 1, in <module>
    i3 + pd.DateOffset(nanoseconds=i3.freq.nanos)

  File "pandas\_libs\tslibs\offsets.pyx", line 690, in pandas._libs.tslibs.offsets.BaseOffset.nanos.__get__

ValueError: <MonthBegin> is a non-fixed frequency
2 个回复

如果您有固定频率,则可以使用 freq 的nanos属性。 例如:

import pandas as pd
i = pd.date_range('2020-03-29', freq='D', periods=3, tz='Europe/Amsterdam')
# DatetimeIndex(['2020-03-29 00:00:00+01:00', '2020-03-30 00:00:00+02:00',
#               '2020-03-31 00:00:00+02:00'],
#              dtype='datetime64[ns, Europe/Amsterdam]', freq='D')

i + pd.DateOffset(nanoseconds=i.freq.nanos)
# DatetimeIndex(['2020-03-30 00:00:00+02:00', '2020-03-31 00:00:00+02:00',
#                '2020-04-01 00:00:00+02:00'],
#               dtype='datetime64[ns, Europe/Amsterdam]', freq=None)

pd.DateOffset是普遍工作。 这是我目前通过所有单元测试的内容,但我愿意改进:

if i.tz is None:
    raise AttributeError("Index is missing timezone information.")

# Get right timestamp for each index value, based on the frequency.
# . This one breaks for 'MS':
# i + pd.DateOffset(nanoseconds=i.freq.nanos)
# . This drops a value at some DST transitions:
# i.shift(1)
# . This one gives wrong value at DST transitions:
# i + i.freq

if i.freq == "15T": # period length always the same
    ts_right = i + pd.Timedelta(hours=0.25)
elif i.freq == "H": # period length always the same
    ts_right = i + pd.Timedelta(hours=1)
else:               # period length dependent on calendar
    if i.freq == "D":
        kwargs = {"days": 1}
    elif i.freq == "MS":
        kwargs = {"months": 1}
    elif i.freq == "QS":
        kwargs = {"months": 3}
    elif i.freq == "AS":
        kwargs = {"years": 1}
    else:
        raise ValueError(f"Invalid frequency: {i.freq}.")
    ts_right = i + pd.DateOffset(**kwargs)

(我只实现了与我的用例相关的.freq值。)

1 将freq字符串转换为pandas中的DateOffset

在pandas文档中,当谈到诸如“W”或“W-SUN”的频率字符串时,可以阅读“在引擎盖下,这些频率字符串被转换为pandas DateOffset的实例”。 然后,如何在给定字符串的情况下获取DateOffset的实例? 最终希望用频率配置我的程序作为字符串(比如“W-SUN”),但内 ...

2 将字符串转换为浮动pandas

简单问题:我有一个从csv文件导入的数据集,其中包含一个带有数值的字符串列。 逗号后面是小数位。 我想转换为float。 基本上,就是这样: 为什么这不起作用以及如何解决这个简单的问题? 提前致谢。 ...

3 将字符串值转换为频率计数

我对 R 比较陌生,我正在努力重组 data.table 中的表。 该表目前如下: 我正在尝试将其设置如下: 等。为了使用 ggplot2 在 x 轴上有雪深,在 y 轴上有频率计数,以及 2 个物种的 2 条线。 我试过这个 而是得到这个输出 当我输入这个时,我也收到错误消息(从 ...

5 将特定的字符串转换为以pandas为单位的数值

我正在尝试对一些降雨数据进行数据分析。 数据示例如下: 降雨数据包含特定的字符串“ TRACE ”或“ T ”(均表示不可测量的降雨量)。 为了进行分析,我想将此字符串转换为'1.0'(float)。 我想要的数据应如下所示,以便将值绘制为折线图:- 有人可以指出我正确的方 ...

6 在 Pandas 数据框中将多列转换为字符串

我有一个具有不同数据类型的熊猫数据框。 我想将数据框中的一列以上转换为字符串类型。 我已经为每一列单独做了,但想知道是否有一种有效的方法? 所以目前我正在做这样的事情: 我想要一个函数来帮助我传递多列并将它们转换为字符串。 ...

7 Pandas 将字符串类型的 JSON 值转换为 INT

我有 JSON 形式的对象列表。 每个对象都有两个属性: id(string)和arg(number) 。 当我使用pandas.read_json(...) ,生成的 DataFrame 也将 id 解释为数字,这会导致问题,因为信息丢失了。 我希望有一个这样的 DataFrame: 我 ...

10 Pandas将dtype对象转换为字符串

我无法转换列的dtype。 我正在从yahoo finance加载一个csv文件。 这给了我以下信息: 我尝试将日期转换为字符串,但无论我尝试它不起作用。 我试图遍历行并用str()转换它。 我试图用dt['Date'].apply(str)更改对象的dtype .appl ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM