【问题标题】:Extracting data belonging to a day from a given range of dates on a dataset从数据集的给定日期范围中提取属于某一天的数据
【发布时间】:2019-02-15 07:44:38
【问题描述】:

我有一个日期范围为 2018 年 1 月 12 日至 8 月 3 日的数据集,其中包含一些值:

my_dfDataFrame的维数为:

my_df.shape 
(9752, 2)

每行包含半小时频率

第一行从2018-01-12开始

my_df.iloc[0]
Date:       2018-01-12 00:17:28
Value                      1
Name: 0, dtype: object

最后一行以2018-08-03结尾

my_df.tail(1)
                  Date:     Value
9751    2018-08-03 23:44:59  1

我的目标是选择每天对应的数据行并将其导出为 CSV 文件。

要仅获取 1 月 12 日的数据并保存到可读文件,我执行:

# Selecting data value of each day
my_df_Jan12 = my_df[(my_df['Fecha:']>='2018-01-12 00:00:00') 
              & 
              (my_df['Fecha:']<='2018-01-12 23:59:59')
                                   ]
my_df_Jan12.to_csv('Data_Jan_12.csv', sep=',', header=True, index=False)

从 1 月 12 日到 8 月 3 日共有 203 天(28 周)

我不想每天手动执行这个查询,那么我正在尝试以下基本分析:

  • 我需要生成203个文件(每天1个文件)
  • 1 月 12 日(1 月 12 日)开始的那一天
  • 一月是第一个月 (01),八月是八个月 (08)

然后:

  • 我需要迭代 203 天的总数
    • 并且是必需的在每个日期行值检查 带有订单的月份和日期起息日以检查更改 他们每个人

根据上述,我正在尝试这种方法:

# Selecting data value of each day (203 days)
for i in range(203):
    for j in range(1,9): # month
        for k in range(12,32): # days of the month
            values = my_df[(my_df['Fecha:']>='2018-0{}-{} 00:00:00'.format(j,k)) 
            &  
            (my_df['Fecha:']<='2018-0{}-{} 23:59:59'.format(j,k))]
            values.to_csv('Values_day_{}.csv'.format(i), sep=',', header=True, index=False)

但是当我在几个月的日子里迭代range(12,32) 时,我有一个问题,这个range(12,32) 只适用于一月的第一个月,我想是的......

最后,由于我做错了什么,我得到了 203 个空的 CSV 文件......

我该如何解决这个适合方式的小挑战? 任何方向都受到高度赞赏

【问题讨论】:

    标签: python pandas extract


    【解决方案1】:

    这样的?我将您原来的Date: 列重命名为Timestamp。我还假设您拥有的Date: 系列是熊猫DateTime 系列。

    my_df.columns = ['Timestamp', 'Value']
    my_df['Date'] = my_df['Timestamp'].apply(lambda x: x.date())
    dates = my_df['Date'].unique()
    for date in dates:
        f_name = str(date) + '.csv'
        my_df[my_df['Date'] == date].to_csv(f_name)
    

    【讨论】:

    • 不需要 lambda 函数:my_df['Timestamp'].dt.date 将为您提供日期。
    • 这就是我喜欢 StackOverflow 的原因 :) 谢谢@ALollz!
    • 嗨 @VishnuKunchur my_df 是熊猫数据框,我检查了您的解决方法,但我的 Date 列未重命名为 Timestamp 我得到 KeyError: 'Timestamp'
    • 还要确保您创建的Timestamp 系列是熊猫日期时间对象。如果您不确定,请执行此操作:my_df['Timestamp'] = pd.to_datetime(my_df['Timestamp'])
    • 我不明白 - 你是在告诉我最终的 .csv 文件不包含 Value 列吗?如果你按照所示逐行执行代码,你应该能够得到你想要的。
    【解决方案2】:

    groupby

    for date, d in df.groupby(pd.Grouper(key='Date', freq='D')):
      d.to_csv(f"Data_{date:%b_%d}.csv", index=False)
    

    请注意,我使用的是 Python 3.6+ 的 f 字符串
    否则,使用这个

    for date, d in df.groupby(pd.Grouper(key='Date', freq='D')):
      d.to_csv("Data_{:%b_%d}.csv".format(date), index=False)
    

    考虑df

    df = pd.DataFrame(dict(
        Date=pd.date_range('2010-01-01', periods=10, freq='12H'),
        Value=range(10)
    ))
    

    然后

    for date, d in df.groupby(pd.Grouper(key='Date', freq='D')):
      d.to_csv(f"Data_{date:%b_%d}.csv", index=False)
    

    并验证

    from pathlib import Path
    
    print(*map(Path.read_text, Path('.').glob('Data*.csv')), sep='\n')
    
    Date,Value
    2010-01-05 00:00:00,8
    2010-01-05 12:00:00,9
    
    Date,Value
    2010-01-04 00:00:00,6
    2010-01-04 12:00:00,7
    
    Date,Value
    2010-01-02 00:00:00,2
    2010-01-02 12:00:00,3
    
    Date,Value
    2010-01-01 00:00:00,0
    2010-01-01 12:00:00,1
    
    Date,Value
    2010-01-03 00:00:00,4
    2010-01-03 12:00:00,5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2019-03-07
      • 1970-01-01
      • 2022-06-23
      相关资源
      最近更新 更多