【问题标题】:Making a list out of an index from a datetime从日期时间的索引中制作列表
【发布时间】:2015-10-20 17:03:52
【问题描述】:

主要问题:我设置 df 索引这样做:df.index = pd.to_datetime(df.index, format='%m/%d/%Y %H:%M') 这给了我这个:

print df.index
<class 'pandas.tseries.index.DatetimeIndex'>
[2014-07-28 09:42:08, ..., 2015-07-28 09:06:12]
Length: 15177, Freq: None, Timezone: None

我想要一个月份和年份的列表,以便使用它们进行绘图,如下所示:["Jan 2015", "Feb 2015", "Mar 2015", "Apr 2015", "May 2015", "June 2015", "Jul 2015", "Aug 2014", "Sep 2014", "Oct 2014", "Nov 2014", "Dec 2014"]

背景:我正在收集一年的数据并使用 Bokeh 制作图表。 y 轴是月份,x 轴是 CompanyName。我想将年份添加到月份中,尽管这会动态变化,所以我不想像几个月那样手动进行。

df = pd.read_csv('MYDATA.csv')
df['recvd_dttm'] = pd.to_datetime(df['recvd_dttm'])

#Only retrieve data before now (ignore typos that are future dates)
mask = df['recvd_dttm'] <= datetime.datetime.now()
df = df.loc[mask]
# get first and last datetime for final week of data

range_max = df['recvd_dttm'].max()
range_min = range_max - pd.DateOffset(years=1)

# take slice with final week of data
df = df[(df['recvd_dttm'] >= range_min) & 
               (df['recvd_dttm'] <= range_max)]
df = df.set_index('recvd_dttm')
df.index = pd.to_datetime(df.index, format='%m/%d/%Y %H:%M')

然后我有代码来提取所需的数据并将其格式化为用于绘图的数据透视表。接下来,我制作图:

MonthNames = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
p = figure(title="Customer Calls for blank in Last Year", 
    x_range=Companies, y_range=MonthNames,
    x_axis_location="above", plot_width=1200, plot_height=900,
    toolbar_location="left", tools=TOOLS)

我想要["Jan 2015", "Feb 2015", "Mar 2015", "Apr 2015", "May 2015", "June 2015", "Jul 2015", "Aug 2014", "Sep 2014", "Oct 2014", "Nov 2014", "Dec 2014"] 我尝试使用 + '%Y' 连接到 y_range 但我得到了TypeError: can only concatenate list (not "str") to list

我很确定解决方案是获取 df.index 并将其放入列表中,然后删除重复并将其添加到 y_range 中。 我试着做date_list = [set(df.index.year)],但这显然给了[{2014, 2015}],这没有帮助。

我不知道该怎么做,有人有什么建议吗?

【问题讨论】:

    标签: python pandas indexing dataframe bokeh


    【解决方案1】:

    试试类似的东西

    import datetime as dt
    import pandas as pd
    [dt.datetime.strftime(n,'%b-%Y') for n in pd.DataFrame(yourdataframe).resample('M').index]
    

    我认为它应该返回您正在寻找的格式化日期时间列表。

    它需要您的索引,每月将其重新索引为“M”(其他选项可用,例如 A=每年,Q=每季度等) 然后遍历结果,使用 dt.datetime.strftime 函数将它们转换为您所追求的格式。 最后,作为列表理解的一部分,所有内容都被封装到一个列表中。

    【讨论】:

    • 我会收到不同的错误,具体取决于我尝试放置它的位置。一种是 TypeError:仅对 DatetimeIndex、TimedeltaIndex 或 PeriodIndex 有效。当我在设置索引并将其转换为_datetime 后尝试执行此操作时。另一个是 DataError: No numeric types to aggregate, If I use it after take my slice of data without setting the index.
    • 啊哈好吧,如果您的数据框包含无法很好聚合的数据,有时重新采样的事情会变得很棘手-您可以尝试仅使用原始索引中的索引构建一个新的数据框-可能类似于 @ 987654322@ 应该创建一个 DataFrame q,然后您可以遍历 strftime 函数[dt.datetime.strftime(n,'%b-%Y') for n in q] - 更好吗?
    猜你喜欢
    • 2018-10-22
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2020-05-27
    • 2014-02-19
    • 2015-02-21
    • 2020-04-07
    • 2023-01-12
    相关资源
    最近更新 更多