【问题标题】:DateOffset from Year to Month and WeekDateOffset 从年到月和周
【发布时间】:2015-10-03 08:33:27
【问题描述】:

我在一段时间内提取大量数据。它正在从列 recvd_dttm 中提取日期和时间。它需要从一年前开始的所有数据。我想修改它以便它可以拉一个月或一天,但 pd.DateOffset(months=1) 给出了KeyError:1 错误。如果我将它更改为 days=7,我会得到同样的错误。但它适用于years = 1。这是怎么回事?

df = pd.read_csv('MYDATA.csv')

# filter by countries with at least one medal and sort
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)]

编辑:问题出在代码的其他地方!

【问题讨论】:

  • 你能澄清你的最终目的是什么吗?是要获得每年的最大值吗?
  • 没有。最终目的是从用户输入的特定范围内获得一部分数据。他们选择一天、一个月、一年,然后从 csv 中提取相应数量的数据。
  • range_max 和 range_min 行呢?你希望那些试图完成什么?这些只是所选范围的起点和终点吗?

标签: python date datetime pandas dataframe


【解决方案1】:

尝试使用timedelta 而不是DateOffset

【讨论】:

  • 我应该把它写成我试过的东西。我不想在一个月内做 timedelta(days=30) 或任何事情,因为它在几个月内不准确。如果我尝试 months=1,我会得到 TypeError: 'months' is an invalid keyword argument for this function。年相同=1
【解决方案2】:

您是否尝试过更明确地说明 pd.DateOffset 的作用?

例如:

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

然后替换月份和日期值。

【讨论】:

  • 问题是 pd.DateOffset(years=1) 工作得很好。替换月份和日期会导致错误。使用您的建议,我收到错误 TypeError: cannot use a non-absolute DateOffset in datetime/timedelta operations [] 我的语法错误吗?
  • hm 你能提供一行数据给我玩吗?
  • 我有一个示例列给你。希望有帮助!
  • 对于您的示例列,我可以毫无问题地使用您的原始代码。日子和月份都在工作。会不会是数据问题?
  • 哇,是的,这是数据问题。感谢您帮助我意识到这一点。最初的代码在那年之后几个月都经过,但很明显,如果你花一个月的代码,就没有一月可用。我现在必须解决这个问题,谢谢!
【解决方案3】:

您是否考虑过使用 Unix 纪元时间而不是格式较少的日期?有一个有据可查的answer for converting to Unix Time,处理问题中的这种偏移似乎会容易得多,因为使用或多或少连续的实数值序列更容易实现滑动范围。

【讨论】:

    【解决方案4】:

    您可以使用来自pd.tseries.offsets 的偏移系列。下面是示例代码。

    import pandas as pd
    import datetime
    
    # your data
    # ================================
    df = pd.read_csv('/home/Jian/Downloads/MOCK_DATA.csv', usecols=[1, 4])
    
    df['recvd_dttm'] = pd.to_datetime(df['recvd_dttm'])
    mask = df['recvd_dttm'] <= datetime.datetime.now()
    df = df.loc[mask]
    
    
    # flexible offsets
    # =======================================
    print(range_max)
    
    2015-07-14 16:52:58
    
    # for 1 month: currently there is a bug
    # range_min_month = range_max - pd.tseries.offsets.MonthOffset(1)
    
    # for 1 week
    range_min_week = range_max - pd.tseries.offsets.Week(1)
    print(range_min_week)
    
    2015-07-07 16:52:58
    
    # for 5 days
    range_min_day = range_max - pd.tseries.offsets.Day(5)
    print(range_min_day)
    
    2015-07-09 16:52:58
    

    【讨论】:

    • 谢谢建勋!我实际上意识到这个问题非常愚蠢,因为问题在代码的其他地方。
    猜你喜欢
    • 2012-09-24
    • 2018-06-15
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 2016-06-25
    相关资源
    最近更新 更多