【问题标题】:Date ranges in PandasPandas 中的日期范围
【发布时间】:2012-11-06 20:46:35
【问题描述】:

在与 NumPy 和 dateutil 斗争了几天之后,我最近发现了神奇的 Pandas 库。我一直在研究文档和源代码,但我不知道如何让date_range() 在正确的断点处生成索引。

from datetime import date
import pandas as pd

start = date('2012-01-15')
end = date('2012-09-20')
# 'M' is month-end, instead I need same-day-of-month
date_range(start, end, freq='M')

我想要什么:

2012-01-15
2012-02-15
2012-03-15
...
2012-09-15

我得到了什么:

2012-01-31
2012-02-29
2012-03-31
...
2012-08-31

我需要一个月大小的块来说明一个月中的可变天数。这可以通过 dateutil.rrule 实现:

rrule(freq=MONTHLY, dtstart=start, bymonthday=(start.day, -1), bysetpos=1)

丑陋且难以辨认,但它有效。我怎么能用熊猫做到这一点?我玩过date_range()period_range(),到目前为止都没有运气。

我的实际目标是使用groupbycrosstab 和/或resample 根据期间内各个条目的总和/平均值/等计算每个期间的值。换句话说,我想从以下位置转换数据:

                total
2012-01-10 00:01    50
2012-01-15 01:01    55
2012-03-11 00:01    60
2012-04-28 00:01    80

#Hypothetical usage
dataframe.resample('total', how='sum', freq='M', start='2012-01-09', end='2012-04-15') 

                total
2012-01-09          105 # Values summed
2012-02-09          0   # Missing from dataframe
2012-03-09          60
2012-04-09          0   # Data past end date, not counted

鉴于 Pandas 最初是一种财务分析工具,我几乎可以肯定有一种简单快捷的方法可以做到这一点。感谢您的帮助!

【问题讨论】:

    标签: python pandas datetime time-series


    【解决方案1】:

    试试

    date_range(start, end, freq=pd.DateOffset(months=1))
    

    【讨论】:

    • 对于 'freq=...' 也可以使用 pd.DateOffset(months=1)
    【解决方案2】:

    实际上没有“一个月中的某天”频率(例如“DOM09”之类的“DOMXX”),但我认为没有理由不添加一个。

    http://github.com/pydata/pandas/issues/2289

    我目前没有适合您的简单解决方法,因为resample 需要通过已知的频率规则。我认为应该扩大它以能够将任何日期范围用作任意 bin 边缘。只是时间问题和黑客行为......

    【讨论】:

    • 这个问题的浏览量刚刚达到 10K。也许是时候重新审视这个功能了?
    【解决方案3】:

    freq='M' 用于月末频率(请参阅here)。但是您可以使用.shift 将其移动任意天数(或任何频率):

    pd.date_range(start, end, freq='M').shift(15, freq=pd.datetools.day)
    

    【讨论】:

    • 谢谢,这可能是我创建基于 rrule hack 的解决方案所需的技巧。但是,这对重新采样范围没有帮助,因为重新采样仍将使用与 AFAIK 月初对齐的 bin。
    • 如果您要移动固定天数,则使用月份开始“MS”更有意义:pd.date_range(start, end, freq='MS').shift(15, freq=pd.datetools.day)
    猜你喜欢
    • 2017-09-26
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多