kni*_*ite 23 python datetime time-series pandas
在与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')
Run Code Online (Sandbox Code Playgroud)
我想要的是:
2012-01-15
2012-02-15
2012-03-15
...
2012-09-15
Run Code Online (Sandbox Code Playgroud)
我得到了什么:
2012-01-31
2012-02-29
2012-03-31
...
2012-08-31
Run Code Online (Sandbox Code Playgroud)
我需要一个月大小的块来计算一个月中可变的天数.这可以使用dateutil.rrule:
rrule(freq=MONTHLY, dtstart=start, bymonthday=(start.day, -1), bysetpos=1)
Run Code Online (Sandbox Code Playgroud)
丑陋和难以辨认,但它的工作原理.我怎么能和熊猫一起做这个?我打得既date_range()和period_range(),到目前为止,没有运气.
我的实际目标是使用groupby,crosstab和/或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')
Run Code Online (Sandbox Code Playgroud)
至
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
Run Code Online (Sandbox Code Playgroud)
鉴于Pandas起源于财务分析工具,我几乎可以肯定,有一种简单快捷的方法可以做到这一点.帮助赞赏!
Mat*_*ohn 23
freq='M'是月末频率(见这里).但是您可以使用.shift它来移动任意天数(或任何频率):
pd.date_range(start, end, freq='M').shift(15, freq=pd.datetools.day)
Run Code Online (Sandbox Code Playgroud)
实际上没有"日期"的频率(例如"DOMXX",如"DOM09"),但我认为没有任何理由不加一个.
http://github.com/pydata/pandas/issues/2289
我目前没有简单的解决方法,因为resample需要通过已知的频率规则.我认为它应该增加,以便能够将任何日期范围用作任意bin边缘.只是时间和黑客的问题......
小智 7
尝试
date_range(start, end, freq=pd.DateOffset(months=1))
Run Code Online (Sandbox Code Playgroud)