【问题标题】:Drop datetimes not within certain range from index从索引中删除不在特定范围内的日期时间
【发布时间】:2018-05-14 21:06:41
【问题描述】:

我有一个这样的 DataFrame:

Date                 X
....
2014-01-02 07:00:00 16
2014-01-02 07:15:00 20
2014-01-02 07:30:00 21
2014-01-02 07:45:00 33
2014-01-02 08:00:00 22
....
2014-01-02 23:45:00 0
....

1) 所以我的“日期”列是一个日期时间,并且每天每 15 分钟都有一个值。

我想要的是删除时间不在 08:00 和 18:00 之间的所有行。

2) 数据中缺少某些日子...我如何将缺少的日子放入我的数据框中并用值 0 作为 X 填充它们。

我的方法:在两个日期之间创建一个新系列并将 15 分钟设置为频率并将我的 X 列与新创建的系列连接。对吗?


编辑: 我的第二个问题的问题:

#create new full DF without missing dates and reindex
full_range = pandas.date_range(start='2014-01-02', end='2017-11-
14',freq='15min') 
df = df.reindex(full_range,fill_value=0)

df.head()

输出:

                    Date        X
2014-01-02 00:00:00 1970-01-01  0
2014-01-02 00:15:00 1970-01-01  0
2014-01-02 00:30:00 1970-01-01  0
2014-01-02 00:45:00 1970-01-01  0
2014-01-02 01:00:00 1970-01-01  0

如你所见,那没有用。

顺便说一句,“日期”列不是索引。我需要它作为我的 df 中的列

他为什么选择“1970-01-01”? 1970 年对我来说毫无意义

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我想要的是删除时间不在 08:00 之间的所有行 和 18:00 点。

    使用datetime.time 创建一个蒙版。示例:

    from datetime import time
    
    idx = pd.date_range('2014-01-02', freq='15min', periods=10000)
    df = pd.DataFrame({'x': np.empty(idx.shape[0])}, index=idx)
    t1 = time(8); t2 = time(18)
    times = df.index.time
    mask = (times > t1) & (times < t2)
    df = df.loc[mask]
    

    数据中缺少某些日子...我该如何填写缺少的日子 在我的 DataFrame 中并用值 0 作为 X 填充它们?

    1. 使用pd.date_range() 构建一个没有缺失数据的日期范围(见上文)。
    2. 在df 上致电reindex() 并指定fill_value=0。

    在 cmets 中回答您的问题:

    • np.empty 创建一个空数组。我只是用它来构建一些基本上是垃圾的“示例”数据。这里idx.shape 是你的索引的形状(长度,宽度),一个元组。所以np.empty(idx.shape[0]) 创建了一个与idx 长度相同的空一维数组。
    • times = df.index.time 创建一个名为 times 的变量(一个 NumPy 数组)。 df.index.time 是df 索引中每个元素的时间。您可以自己探索这一点,只需将代码分成几部分并自己进行试验。

    【讨论】:

    • 我的数据框说:“系列”对象没有属性“时间””如果我做“时间 = df.Date.time”,日期是我的列而不是索引。我需要它作为专栏@Brad Solomon
    • 啊..明白了。 "times = pd.DatetimeIndex(df['Date']).time" 有效:)
    • 试试times = df.Date.dt.time
    • 你好@Brad Solomon。又是我。目前我正在尝试实现我的第二个问题(数据中缺少某些日子......我如何将缺少的日子放在我的 DataFrame 中并将它们填充为值 0 作为 X?)。正如你所说,我定义了一个新的日期范围:“newDF = pandas.date_range(start='2014-01-02', end='2017-11-14',freq='15min')”然后我写了“new = df.reindex(newDF ,fill_value=0)" 但它为我创建了一个新列“日期”,他没有为 X 取任何值。一切都是 0。我认为问题是日期在 df 上没有索引。我需要日期作为列,而不是作为 df 中的索引
    • 你收到消息了吗
    猜你喜欢
    • 2023-01-10
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多